使用Entity Framework 6 Code First中的newid()函数

3
我希望通过 Entity Framework 6 Code First,使用 newid() 来设置 SQL 数据库表的主键默认值。 我知道如何在代码中进行操作,并在 stackoverflow 上找到了一些方法,例如 How to set NewId() for GUID in entity framework
但是:我有一个备份/恢复机制,它不是通过对象而是直接作为块插入到数据库中。因此,在 SQL 数据库中插入具有 null 作为 guid 的行将失败。
可以添加注释来解决这个问题。
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public Nullable<Guid> Entity_OID { get; set; }

这将成功地将NEWSEQUENTIALID()添加为默认值,它与newid()执行的操作类似(它添加一个新的guid,该guid高于最近的guid,因此您在输入中获得有序性能)。但是,由于这是一个已经存在且没有EF的数据库,所以我希望尽可能少地进行更改。因此,我对NEWSEQUENTIALID()不是很满意。我更喜欢它仍然只是newid()。但是,在Entity Framework 6 Code First中,我没有找到任何关于newid()的注释/映射。并且按照设计,所有对数据库的更改都必须通过代码完成。请问是否有人知道如何通过代码将默认值newid()添加到行中?谢谢!

你不能只是不使用自动生成的键并在构造函数中设置键值吗?我认为GUID保证是唯一的,所以它们是由数据库还是由您的代码生成都无所谓,而且您不应该陷入同一个GUID被生成两次的情况(再次强调 - 因为GUID应该是全局唯一的)。 - Pawel
是的,我可以做到,这对通过业务逻辑在我的代码中创建的实体有效。但是如果我通过流从cbak文件还原,而没有创建任何实体,那么数据库就必须生成它们。 - Oliver Müller
2个回答

2
似乎在Code First中,我尝试的事情是不可能的。 并且使用了

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

即使我在context.SaveChanges()之前设置了一个Guid,Entity Framework也会生成一个新的Guid,这不是我预期的行为。


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接