【问题标题】:Adding Entity object with foreign key使用外键添加实体对象
【发布时间】:2011-01-12 05:01:01
【问题描述】:

在数据库中我有 2 个表:
文章:ID |标题|部分ID
部分:ID |部分名称
(所有 id 都设置为 Identity Increment)

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

我厌倦了这个:

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

art.Section.SectionID = 0;


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

我收到关于 art.Section.SectionID = 0 的错误;

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

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

【问题讨论】:

    标签: c# entity-framework


    【解决方案1】:

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

    只需从您的上下文中获取 Section 对象并分配它。

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

    【讨论】:

    • 无论如何它说 Linq to entity 不支持 SingleOrDefault 并且应该使用 FirstOrDefault。
    • 是的,你的方法是对的。性能:至少在我的项目中我没有感觉到它。此外,您还具有对象是强类型的优势,如果您自己构造实体键,这可以减少潜在的错误。
    【解决方案2】:

    在 EF 4 中,您可以选中更新模型向导上的框以在模型中包含外键字段。如果这样做,您可以将代码更改为:

    Article art = new Article
    {
        Title = "title"
    };
    
    art.SectionID = 0;
    
    if (art.EntityState == EntityState.Detached)
    {
       Articlerctx.AddToArticles(art);
    }
    

    【讨论】:

      【解决方案3】:
      art.SectionReference.EntityKey = new EntityKey("EntityModelName.EntitySetName", "IdFieldName", 0);
      

      【讨论】:

      • 我意识到问题中的示例没有使用 POCO,但我认为值得注意的是,这不适用于 POCO。
      • 如果 Section ids 是众所周知的,并且不会很快改变,我用枚举来做这个模式,例如(int)SectionId.Introduction。这减少了幻数并提高了清晰度。但是,如果可以在您的应用程序中修改这些部分,请不要这样做。
      • 我不喜欢这个,因为弱类型
      • 是的。在类型安全和没有 db 往返之间有一个权衡。顺便说一句,第一个参数应该更像“EntityModelName.EntitySetName”,例如“MyEntityModel.Customers”。无论如何,您现在可以选择两种解决方案——我的用于性能,另一种用于类型安全。坦率地说,除非测试发现性能问题,否则我会选择类型安全。
      • 关于第一个参数你是对的,15分钟我不明白为什么它不接受封装(?)模型的对象......它只接受模型。跨度>
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-18
      • 2010-10-16
      • 1970-01-01
      • 2019-04-13
      • 2017-01-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多