2

に違反し、EFコード-最初に以下の4つのクラスが含ま使用して小規模なプロジェクトで作業しようとしている:OfficeRoleUserOfficeUserを。私はUser(マスターRoleId FK Role.RoleIdを定義)とOfficeUser(Role.RoleIdに特定のオフィスFKためOfficeRoleIdを定義する)、またUserOfficeUserの間で同じRoleクラスを使用しようとしていますです多重度制約は、私はMVC/C#に新しいですVS 2010/SQL Serverの/ EFコード・ファースト

問題は、独自の関係を有しています。

私はAuthorizeAttributeを使用して私の許可書を書こうとしていますが、特定のユーザの役割をそのサイトにログインする必要があります。私が手

public User GetUserRoleByUserName(string userName, string passWord) 
{ 
    using (var context = DataContext) 
    { 
     return context.Users.Include("Role") 
          .Include("OfficeUsers") 
          .SingleOrDefault(u => u.UserName == userName && u.Password == passWord); 
     } 
    } 

を実行したとき、私は違反エラー

多重度制約を以下ます。関係 'Inventory.Repository.User_OfficeUsers'のロール 'User_OfficeUsers_Target' は の多重度1または0..1です。

どうすればこの問題を解決できますか教えてください。

public class Office 
{ 
     public Office() 
     { 
      OfficeUsers = new HashSet<OfficeUser>(); 
     } 

     public int OfficeId { get; set; } 
     public string OfficeName { get; set; } 

     public virtual ICollection<OfficeUser> OfficeUsers { get; set; } 
} 

public class Role 
{ 
    public Role() 
    { 
     Users = new HashSet<User>(); 
     OfficeUsers = new HashSet<OfficeUser>(); 
    } 

    public int RoleId { get; set; } 
    public string RoleName { get; set; } 
    public string Description { get; set; } 

    public virtual ICollection<User> Users { get; set; } 
    public virtual ICollection<OfficeUser> OfficeUsers { get; set; } 
} 

public class User 
{ 
    public User() 
    { 
     OfficeUsers = new HashSet<OfficeUser>(); 
    } 

    public int UserId { get; set; } 
    public string UserName { get; set; } 
    public string Password { get; set; } 
    public int RoleId { get; set; } 

    public virtual ICollection<OfficeUser> OfficeUsers { get; set; } 
    public virtual Role Role { get; set; } 
} 

public class OfficeUser 
{ 
    public OfficeUser() 
    { 
    } 

    public int OfficeUserId { get; set; } 
    public int OfficeId { get; set; } 
    public int UserId { get; set; } 
    [ForeignKey("Role")] 
    public int OfficeRoleId { get; set; } 
    public bool Active { get; set; } 

    public User User { get; set; } 
    public Office Office { get; set; } 
    public Role Role { get; set; } 
} 
+0

私はエラーを再現できませんでした。 – Eranga

答えて

2

これは、ユーザーとOfficeの間の関係をマップするための設定がない場合に発生します。ここではサンプルの設定クラス

public class UserConfiguration : EntityTypeConfiguration<User> 
    { 
     public LocationConfiguration() 
     { 
      HasKey(a => a.Id); 
      HasMany(user => user.OfficeUsers).WithOptional(officeuser => officeuser.User). 
       HasForeignKey(officeuser => officeuser.UserId); 
     } 
    } 

public class YourContext : DbContext 
    { 

     // your DBSets and contructors, etc 


     protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
      modelBuilder.Configurations.Add(new UserConfiguration());    
      base.OnModelCreating(modelBuilder); 
     } 


    } 

EDIT

試しデータアノテーションを削除し、次のように自分のコンテキストにこの設定を追加である "[のForeignKey(" 役割」)]次のようにRoleクラスに構成を追加します。そしてまた、あなたは怠け者を使用する方法の下に使用することができますOfficeUserを照会する場合

public class RoleConfiguration : EntityTypeConfiguration<Role> 
    { 
     public LocationConfiguration() 
     { 
      HasKey(a => a.RoleId); 
      HasMany(role =>role.OfficeUsers).WithOptional(officeuser => officeuser.Role). 
       HasForeignKey(officeuser => officeuser.OfficeRoleId); 
     } 
    } 

EDIT

public int? OfficeRoleId { get; set; } 

としてOfficeRoleIdを宣言OfficeUserクラスの役割のプロパティにvirtualキーワードを追加ローディング

YourQuery().Include(officeuser => officeuser.Role); 

ホップあなたは構文を理解しています よろしくお願いします。

+0

Jayangaさん、ありがとうございます。 "modelBuilder.Entity ().HasMany(user => user.OfficeUsers).WithOptional(officeuser => officeuser.User).HasForeignKey(officeuser => officeuser.UserId);"しかし、私はこのエラーを受けます "Multiplicityは、 'OfficeUser_Role'という関係のRole 'OfficeUser_Role_Target'の参照制約と競合します。依存ロールのすべてのプロパティはnull不可能なので、プリンシパルロールの多重度は '1'でなければなりません。 modelb.Entity ()を使用しています。HasOptional(c => c.Role).WithMany(p => p.OfficeUsers).HasForeignKey(c => c.OfficeRoleId);助けてもらえますか? – hjp

+0

回答を編集してそれをチェックしてください – Jayanga

+0

私は試してみましたが、これでも私にはこのエラーが返ってくれてありがとうございます "MultiplicityがRole 'Role_OfficeUsers_Source'の参照制約と競合していました。従属ロールはnull不可能であり、主ロールの多重度は「1」でなければなりません。 modelBuilder.Entity ().HasMany(role => role.OfficeUsers).WithOptional(officeuser => officeuser.Role)。 HasForeignKey(officeuser => officeuser.OfficeRoleId); – hjp

関連する問題