EF6.1 Code First:添加记录和外键的1:1或零问题

时间:2015-05-21 14:52:52

标签: ef-code-first entity-framework-6.1

我有两个实体,执行和用户。用户可以是执行人员,但是执行人员可以是用户。

执行:

public class Executive
{
    [Key]
    public int ExecutiveId { get; set; }

    // every executive is a user
    public int UserId { get; set; }
    [ForeignKey("UserId")]
    public virtual User User { get; set; }...and so on

用户:

 public class User
{
    [Key]
    public int UserId { get; set; }

    public int? ExecutiveId { get; set; }
    [ForeignKey("ExecutiveId")]
    public virtual Executive Executive { get; set; }... and so on (note the nullable ExecutiveId)

CMSContext:

 protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

        modelBuilder.Entity<Executive>()
            .HasRequired(x => x.User)
            .WithOptional(s => s.Executive)
            .WillCascadeOnDelete(false); ... and so on

所以,我在初始化程序中添加了两个用户和一个执行程序,并在此处添加了一个执行程序:

 var users = new List<User>
        {
            new User{ EmailAddress="a@a.com", LastName="D'Amore", FirstName="Beau", PhoneNumber="888-555-1212"},          
            new User{ EmailAddress="b@b.com", LastName="Munster", FirstName="Herman", PhoneNumber="123-555-7878"}          
        };
        users.ForEach(s => context.Users.Add(s));
        context.SaveChanges();

  Executive exec = new Executive();
        exec.ExecutiveBlurb = "test blurb";
        exec.ExecutiveTitle = "President";
        exec.ProfilePictureContent = new Content { ContentBytes = File.ReadAllBytes("c:\\exec.jpg"), AddedDate = DateTime.Now, AddedByUserId = 1 };
        exec.ProfileSidePictureContent = new Content { ContentBytes = File.ReadAllBytes("c:\\exec2.jpg"), AddedDate = DateTime.Now, AddedByUserId = 1 };
        exec.UserId = 1;
        exec.User = users.Where(x => x.UserId == 1).First();
        exec.ExecutiveSections = context.ExecutiveSections.Where(x => x.SectionName == "Executive Team" && x.SectionName == "Acquisitions").ToList();
        context.Executives.Add(exec);

事实上,执行是在用户之后创建的(因为它应该是因为它是1:1或0)但是用户永远不会获得ExecutiveId设置...没有EF处理外国人密钥自动化?就像,当我将objectA添加到objectB时,通常情况下,将A设置为B,因为它的外键设置B使A具有A作为它的往复属性...我错过了1的东西:1或0的事情。 有什么建议吗?

1 个答案:

答案 0 :(得分:1)

当使用具有1:0..1关系的Entity Framework或任何其他类型的一对一关系时,关系两侧的两个实体必须共享主键。对于依赖的任何一方 - 使用required-optional,它将是可选的一方 - 主键属性也是外键。

在您的情况下,您有一些冲突/冗余注释和流畅的API调用,但流畅的API优先,因此Executive.UserIdUser.ExecutiveId被忽略。您创建的Executive最终应为exec.User.UserId == exec.ExecutiveId

这是有道理的,因为如果没有Executive,您永远不会有User,并且永远不会有多个Executive绑定到同一User,所以Executive不需要单独的主键。

https://msdn.microsoft.com/en-us/data/jj591620#RequiredToOptional