Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架fluentapi映射_C#_Entity Framework_Ef Code First - Fatal编程技术网

C# 实体框架fluentapi映射

C# 实体框架fluentapi映射,c#,entity-framework,ef-code-first,C#,Entity Framework,Ef Code First,假设我有这些表: Role - RoleId - Name UserRole - UserId - RoleId User - UserId - Username UserEmail - UserId - EmailId - IsPrimary Email - EmailId - Address public class Role { public int RoleId { get; set; } public string Name { get; set; }

假设我有这些表:

Role
- RoleId
- Name

UserRole
- UserId
- RoleId

User
- UserId
- Username

UserEmail
- UserId
- EmailId
- IsPrimary

Email
- EmailId
- Address
public class Role {
    public int RoleId { get; set; }
    public string Name { get; set; }
    public virtual ICollection<User> Users { get; set; }
}

public class User {
    public int UserId { get; set; }
    public string Username { get; set; }
    public virtual ICollection<Role> Roles { get; set; }
    public virtual ICollection<UserEmail> UserEmails { get; set; }
}

public class UserEmail {
    public int UserId { get; set; }
    public int EmailId { get; set; }
    public bool IsPrimary { get; set; }
    public virtual User User { get; set; }
    public virtual Email Email { get; set; }
}

public class Email {
    public int EmailId { get; set; }
    public string Address { get; set; }
    public virtual ICollection<UserEmail> UserEmails { get; set; }
}
modelBuilder.Entity<Role>().HasKey(q => q.RoleId);
modelBuilder.Entity<Role>()
    .HasMany(q => q.Users)
    .WithMany(q => q.Roles)
    .Map(q => {
                  q.MapLeftKey("RoleId");
                  q.MapRightKey("UserId");
                  q.ToTable("UserRoles");
              });
modelBuilder.Entity<UserEmail>()
    .HasRequired(q => q.User)
    .WithMany(q => q.UserEmails)
    .HasForeignKey(q => q.EmailId);
现在,我的模型应该是这样的:

Role
- RoleId
- Name

UserRole
- UserId
- RoleId

User
- UserId
- Username

UserEmail
- UserId
- EmailId
- IsPrimary

Email
- EmailId
- Address
public class Role {
    public int RoleId { get; set; }
    public string Name { get; set; }
    public virtual ICollection<User> Users { get; set; }
}

public class User {
    public int UserId { get; set; }
    public string Username { get; set; }
    public virtual ICollection<Role> Roles { get; set; }
    public virtual ICollection<UserEmail> UserEmails { get; set; }
}

public class UserEmail {
    public int UserId { get; set; }
    public int EmailId { get; set; }
    public bool IsPrimary { get; set; }
    public virtual User User { get; set; }
    public virtual Email Email { get; set; }
}

public class Email {
    public int EmailId { get; set; }
    public string Address { get; set; }
    public virtual ICollection<UserEmail> UserEmails { get; set; }
}
modelBuilder.Entity<Role>().HasKey(q => q.RoleId);
modelBuilder.Entity<Role>()
    .HasMany(q => q.Users)
    .WithMany(q => q.Roles)
    .Map(q => {
                  q.MapLeftKey("RoleId");
                  q.MapRightKey("UserId");
                  q.ToTable("UserRoles");
              });
modelBuilder.Entity<UserEmail>()
    .HasRequired(q => q.User)
    .WithMany(q => q.UserEmails)
    .HasForeignKey(q => q.EmailId);
添加一对多关系:

Role
- RoleId
- Name

UserRole
- UserId
- RoleId

User
- UserId
- Username

UserEmail
- UserId
- EmailId
- IsPrimary

Email
- EmailId
- Address
public class Role {
    public int RoleId { get; set; }
    public string Name { get; set; }
    public virtual ICollection<User> Users { get; set; }
}

public class User {
    public int UserId { get; set; }
    public string Username { get; set; }
    public virtual ICollection<Role> Roles { get; set; }
    public virtual ICollection<UserEmail> UserEmails { get; set; }
}

public class UserEmail {
    public int UserId { get; set; }
    public int EmailId { get; set; }
    public bool IsPrimary { get; set; }
    public virtual User User { get; set; }
    public virtual Email Email { get; set; }
}

public class Email {
    public int EmailId { get; set; }
    public string Address { get; set; }
    public virtual ICollection<UserEmail> UserEmails { get; set; }
}
modelBuilder.Entity<Role>().HasKey(q => q.RoleId);
modelBuilder.Entity<Role>()
    .HasMany(q => q.Users)
    .WithMany(q => q.Roles)
    .Map(q => {
                  q.MapLeftKey("RoleId");
                  q.MapRightKey("UserId");
                  q.ToTable("UserRoles");
              });
modelBuilder.Entity<UserEmail>()
    .HasRequired(q => q.User)
    .WithMany(q => q.UserEmails)
    .HasForeignKey(q => q.EmailId);
modelBuilder.Entity()
.HasRequired(q=>q.User)
.WithMany(q=>q.useremail)
.HasForeignKey(q=>q.EmailId);

是否需要最后一行?

是的,
HasKey
方法与
[Key]
属性具有相同的效果。您可能有很多配置要做,并且更愿意将其全部保存在
ModelBuilder
方法中。另一方面,您可能很少或更喜欢对其中的一些属性使用属性。只是给你一些灵活性

如果你说的是:

.HasForeignKey(q=>q.EmailId)

那么在你的情况下,是的,这是必需的。为什么?因为您已经在
UserEmail
实体中创建了自己的外键属性。如果删除了该属性,则可以删除此行,EF将在名为
Email\u Id
的数据库中为您创建一行。您仍然可以通过导航属性
instanceOfUserEmail.Email.EmailId
访问此文件