【问题标题】:Uni-directional one-to-many relationship with Code First与 Code First 的单向一对多关系
【发布时间】:2012-12-19 15:20:33
【问题描述】:

我在联系人和电话之间有一个一对多的单向关系,定义如下:

class Contact {
    int ContactId {get; set}
    ICollection<Phone> Phones {get; set}
}
class Phone {
    int PhoneId {get; set;}
    string PhoneNumber {get; set;}
}

现在在域层,我尝试执行以下操作:

someContact.Phones.Remove(somePhone);

当我尝试拨打context.SaveChanges() 时,我得到一个异常,因为该关系被定义为必需(例如,没有联系人就不能存在电话)。
如何在不使用外键或 Phone 中的导航属性且无需在调用 SaveChanges() 之前调用 DbSet&lt;Phone&gt;.Remove(Phone) 的情况下解决此问题?

【问题讨论】:

  • 你不能只添加一个RemovePhone()-方法到联系人吗?如果史密斯先生和史密斯夫人都在您的数据库中使用同一部手机,并且只有史密斯先生删除了他的帐户,您希望发生什么?
  • 您希望将手机从数据库中删除还是从联系人中取消链接?如果您不定义手机与联系人之间的关系,EF 应该如何知道应该删除手机?

标签: c# .net entity-framework ado.net ef-code-first


【解决方案1】:

你基本上回答了你自己的问题,因为你描述的两件事是分开的:

  1. 取消链接对象
  2. 删除对象

EF 可能有一个聪明的方法来做到这一点,但其他人也问了同样的问题,并得到了你提到的答案:

例如EF 4.1: Removing child object from collection does not delete it - why?

【讨论】:

    【解决方案2】:

    有一种方法可以同时进行 Matthew 在单个步骤中描述的两种镫骨。它需要对您的模型进行一些更改 - 您必须将外键添加到 Phone 实体并创建一个包含 PhoneIdContactId 的复合键。

    这使得Phone 类的实例与Contact 类的实例相关联。使用这些设置,当您从联系人someContact.Phones.Remove(somePhone); 中删除电话时,EF 会从 DB 中删除电话,因为它知道如果没有与该特定联系人的连接,电话就无法存在。

    型号:

    public class Contact {
        public int ContactId { get; set; }
        public virtual ICollection<Phone> Phones { get; set; }
    }
    
    public class Phone {
        public int PhoneId { get; set; }
        public int ContactId { get; set; }
        public string PhoneNumber { get; set; }
    }
    

    配置:

    modelBuilder.Entity<Contact>()
        .HasMany(o => o.Phones)
        .WithRequired()
        .HasForeignKey(f => f.ContactId)
        .WillCascadeOnDelete(true);
    
    modelBuilder.Entity<Phone>()
        .HasKey(o => new { o.PhoneId, o.ContactId });
    

    【讨论】:

    • 你的解决方案很聪明,但它违反了我在我的问题中提到的限制之一,所以它是黑客,我可以找到其他黑客来做同样的想法。我想知道它是否可以在不提供外部或双向导航属性的情况下完成,我认为(至少在当前版本的 EF 中)它无法完成。
    猜你喜欢
    • 1970-01-01
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多