C# 与代码优先的单向一对多关系

C# 与代码优先的单向一对多关系,c#,.net,entity-framework,ado.net,ef-code-first,C#,.net,Entity Framework,Ado.net,Ef Code First,我在联系人和电话之间有一对多单向关系,定义如下: class Contact { int ContactId {get; set} ICollection<Phone> Phones {get; set} } class Phone { int PhoneId {get; set;} string PhoneNumber {get; set;} } 当我尝试调用context.SaveChanges()时,我会遇到一个异常,因为关系是按要求定义的(例

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

class Contact {
    int ContactId {get; set}
    ICollection<Phone> Phones {get; set}
}
class Phone {
    int PhoneId {get; set;}
    string PhoneNumber {get; set;}
}
当我尝试调用
context.SaveChanges()
时,我会遇到一个异常,因为关系是按要求定义的(例如,没有联系人,手机就无法存在)。

如何在不使用外键或手机中的导航属性的情况下解决此问题,并且在调用
SaveChanges()
之前不需要调用
DbSet.Remove(Phone)

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

  • 解除对象的链接
  • 删除对象
  • EF可能有一个聪明的方法来做到这一点,但其他人也提出了同样的问题,并得到了你提到的答案:


    e、 g.

    有一种方法可以同时完成马修在一个步骤中描述的两个镫骨。它需要对您的型号稍作更改-您必须将外键添加到
    Phone
    实体,并创建一个包含
    PhoneId
    ContactId
    的复合键

    这使得
    Phone
    类的实例绑定到
    Contact
    类的实例。使用这些设置,当您从联系人
    someContact.Phones.remove(somePhone)中删除手机时,EF将手机从数据库中删除,因为它知道如果没有与特定联系人的连接,手机将无法存在

    型号:

    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 });
    
    公共类联系人{
    public int ContactId{get;set;}
    公共虚拟ICollection电话{get;set;}
    }
    公用电话{
    公共int PhoneId{get;set;}
    public int ContactId{get;set;}
    公共字符串PhoneNumber{get;set;}
    }
    
    配置:

    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 });
    
    modelBuilder.Entity()
    .HasMany(o=>o.Phones)
    .WithRequired()
    .HasForeignKey(f=>f.ContactId)
    .WillCascadeOnDelete(真);
    modelBuilder.Entity()
    .HasKey(o=>new{o.PhoneId,o.ContactId});
    
    你能不能给联系人添加一个
    RemovePhone()
    -方法?如果史密斯先生和史密斯太太都使用同一部手机在您的数据库中,而只有史密斯先生删除了他的帐户,您希望该手机从数据库中删除还是仅仅从联系人中取消链接?如果你没有定义手机和联系人之间的关系,EF怎么知道应该删除手机?你的解决方案很聪明,但它违反了我在问题中提到的一个限制,所以它是黑客,我可以找到其他黑客来做同样的事。我想知道是否可以在不提供国外或双向导航属性的情况下完成,但我认为(至少在当前版本的EF中)无法完成。