2013-12-17 51 views
3

我想通过实体框架6代码优先使用newid()在SQL数据库中设置表的主键的默认值。 我知道这是如何通过代码完成,也发现了一些方法上的计算器,像How to set NewId() for GUID in entity frameworknewid()与实体框架6代码优先

但是:我有一个备份/恢复机制,插入不是通过对象,但只是作为一个隆起到数据库中的数据。所以这里没有使用实体框架。这意味着一个以guid为null的行将被插入到SQL数据库中并失败。

它可以添加注释

[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public Nullable<Guid> Entity_OID { get; set; } 

,这将成功添加NEWSEQUENTIALID()作为默认值,它做了类似的事情,如NEWID()(它增加了一个新的GUID比越高最近的指导,所以你赢得perfomance,因为你有一个订单在输入)。 但是,因为这是一个已经存在没有EF的数据库,我希望尽可能地做少量更改。所以我对NEWSEQUENTIALID()并不满意。如果它仍然是newid(),我宁愿喜欢它。但是我还没有在Entity Framework 6 Code First中找到newid()的任何Annotation/Mapping。通过设计,所有对数据库的更改都必须通过代码完成。 有谁知道如何通过代码将默认值newid()添加到行?

在此先感谢!

+0

难道你不能使用自动生成的密钥,并设置ctor中的键值?我认为GUID保证是唯一的,所以它应该无关紧要,如果它们是由数据库或代码生成的,并且您不应该陷入两个实体生成相同GUID的情况(再次 - 因为GUID应该是globaly独特) – Pawel

+0

是的,我可以做到这一点,并适用于通过Buisness Logic在我的代码中创建的实体。但是,如果我通过没有创建实体的流从cbak文件恢复,那么数据库必须生成它们。 –

回答

2

看来,我试图做的事情在Code First中是不可能的。 并与

[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
public Nullable<Guid> Entity_OID { get; set; } 

实体框架也将产生一个新的GUID,即使我设置context.SaveChanges()这不是我所期望的行为之前。

0

当您将属性标记为DatabaseGeneratedOption.Identity EF在每次插入操作后从DB生成值并将其设置为属性。 在数据库中,您可以执行所有操作,例如为该列创建默认约束newid()。