繁体   English   中英

更新导航属性或外键?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM