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)
?您基本上回答了自己的问题,因为您描述的两件事是分开的:
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中)无法完成。