C# 添加具有外键的实体对象

C# 添加具有外键的实体对象,c#,entity-framework,C#,Entity Framework,在数据库中,我有两个表: 文章:ID |标题|章节ID 区段:ID |区段名称 (所有ID设置为标识增量) 我想添加具有特定SectionID(存在于数据库中)的新文章 我对此感到厌倦: Article art = new Article { Title = "title" }; art.Section.SectionID = 0; if (art.EntityState == EntityState.Detached) { Articlerctx.AddToArticles

在数据库中,我有两个表:
文章:ID |标题|章节ID
区段:ID |区段名称
(所有ID设置为标识增量)

我想添加具有特定SectionID(存在于数据库中)的新文章

我对此感到厌倦:

Article art = new Article
{
    Title = "title"
};

art.Section.SectionID = 0;


if (art.EntityState == EntityState.Detached)
{
   Articlerctx.AddToArticles(art);
}
我在art.Section.SectionID=0时出错

对象引用未设置为 对象的实例


我需要为一个int字段创建一个完整的对象吗?

您当然可以从数据库中获取对象(对不起,我没有看到“存在于数据库中”)

只需从上下文中抓取
部分
对象并分配它

art.Section = context.Section.FirstOrDefault(s => s.ID == 0);

在EF 4中,您可以选中更新模型向导上的复选框以在模型中包括外键字段。如果执行此操作,则可以将代码更改为:

Article art = new Article
{
    Title = "title"
};

art.SectionID = 0;

if (art.EntityState == EntityState.Detached)
{
   Articlerctx.AddToArticles(art);
}

我意识到问题中的示例没有使用POCO,但我认为值得注意的是,这对POCO不起作用。如果节ID确实是众所周知的,并且不会很快改变,那么我使用enum(例如,(int)SectionId.Introduction)来执行此模式。这减少了幻数,提高了清晰度。但是,如果你的应用程序中的部分可以修改,就不要这样做。我不喜欢这样,因为我的类型很弱。在类型安全和没有db往返之间有一个折衷。顺便说一下,第一个参数应该更像“EntityModelName.EntitySetName”,例如“MyEntityModel.Customers”。无论如何,您现在有两种解决方案可供选择—一种是性能方面的解决方案,另一种是类型安全方面的解决方案。坦白地说,除非测试揭示了性能问题,否则我会选择类型安全性。关于第一个论点,你说得对,15分钟来我不明白为什么它不接受封装(?)模型的对象。。。它只接受模型的原样。无论如何,它说Linq to entities不支持SingleOrDefault,应该使用FirstOrDefault。是的,你的方法是对的。关于表现:至少在我的项目中我没有感觉到。此外,对象具有强类型的优点,如果您自己构造实体键,则可以减少潜在的错误。
Article art = new Article
{
    Title = "title"
};

art.SectionID = 0;

if (art.EntityState == EntityState.Detached)
{
   Articlerctx.AddToArticles(art);
}