我应该在我的实体对象上为Id使用可空类型吗?

时间:2010-04-05 14:53:26

标签: asp.net-mvc repository nullable entity-framework-4

我当前的设置
我有一个具有一些属性的实体对象,其中包括int Id。为了与数据库通信,我创建了一个存储库,其中包括以下方法:

public int Add(TEntity entity)
{
    ObjectSet.AddObject(entity);
    return entity.Id;
}

(它是一个通用存储库,要求TEntityclass,并且它实现IEntity,它只是一个具有int Id属性的接口。)

我的问题:
现在,当我想创建一个新的实体来添加到存储库时,我需要给它一个id。但是,这不允许EF为我自动生成id,因为它已经有了一个值。

可能的解决方案:
我只能想到这两种可能性。

  1. 使Id属性可以为空
  2. EntryInputModel传递给存储库,然后在那里进行映射 目前,我绑定到我的控制器中的EntryInputModel,并使用AutoMapper将其映射到Entry。如果我需要更改它,我还需要重新考虑项目中的依赖项,因为...InputModel...ViewModel类目前只能用于我的Web应用程序。
  3. 哪个更好?有更多方法可以解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

如果您使用SQL Server作为后端,我建议的解决方案是使ID列成为数据库上的INT IDENTITY,并使实体对象中的列不可为空。

添加新实体时,请为ID指定一些任意值,例如-1或者其他值,或者根本没有值。插入新实体时,SQL Server将自动生成实际ID(

EntityContext.AddToEntities(newEntity);
EntityContext.SaveChanges();

它将自动发送回EF,这样您就可以在插入后立即使用它:

int newEntityID = newEntity.ID;

就像魅力一样 - 至少在我的测试应用程序中: - )

答案 1 :(得分:0)

您可以生成不是由数据存储区/ EF生成的唯一ID,允许您在将对象传递到EF之前定义它们...(想想Guid的)