![](/img/trans.png)
[英]How to expose Foreign Key property to existing entity having navigational property using EF6 Code First
[英]Update the navigational property or the foreign key?
我正在使用Entity Framework,并且想要更新导航属性。 例如,我有一个Profile
对象,它具有Gender
的导航属性。 我想改变Gender
。 我可以更新的GenderID
中的Profile
对象,这是外键,或初始化Gender
与新的Gender
对象; 所以:
profile.GenderID = 2;
要么
Profile.Gender = new Gender{ID=2, Name = "Female"};
假设我有一个像Languages这样的集合来表示1:n关系。 我是否有LanguageID列表或语言列表? 如何在不影响数据库的情况下更新列表?
如果我选择后者,是什么告诉实体框架提交更新或插入? 是主键吗?
您有以下选择:
1.更新父对象中的外键字段:
profile.GenderID = 2;
这具有更新模型中该字段的效果,然后调用.SaveChanges();
之后.SaveChanges();
在上下文中 ,数据库将更新,并且对象上的Navigation属性也会更新。
2.直接将导航属性更新为已附加到上下文的EXISTING对象:
例如:
var femaleEntity = context.Genders.First(g=>g.Name == "Female");
profile.Gender = femaleEntity;
在这种情况下,导航属性会立即更新,但是在profile
对象上不会更新.GenderId
字段,直到您调用context.SaveChanges();
为止context.SaveChanges();
这样,EF会将新值写入数据库中的GenderId列,并更新profile
对象上的.GenderId
属性。
3.使用NEW对象更新导航属性:
Profile.Gender = new Gender{ID=2, Name = "Female"};
此处,EF会尝试将ID为2且名称= female的新Gender行添加到数据库中。 您几乎可以肯定只想在数据库的性别表中没有“女性”行并且性别标识符是数据库分配的身份的情况下执行此操作,则在调用.SaveChanges( )。
忽略关于何时通过EF更新对象的微妙之处,前2个选项大致相同*,但第3个选项具有不同的行为。 我们需要知道(或确定)我们是否需要链接到现有的Gender对象或向数据存储中添加一个新对象。
完全相同的原则也适用于您的1:许多关系:
profile.Languages = new List<Languages>
{
new Language{Name = "Spanish"}
}
在语言表中创建一个新行,而:
var spanish = context.Languages.First(l=>l.Name == "Spanish");
profile.Languages = new List<Languages>
{
spanish
}
查找名称为“ Spanish”的现有行,然后更新导航属性。
如果您有存储在变量中的语言ID列表,则要使用关联的语言对象更新导航属性,可以执行以下操作:
var languagesToAdd = context.Languages.Where(l=>languageIds.Contains(l.ID)).ToList();
profile.Languages = languagesToAdd;
*当然有与选项2的性能损失,如果你还没有在内存中附加性别对象,因为例如,通过调用获取数据, .First()
是在我的例子,将(当然)需要另一个往返数据库。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.