【问题标题】:Auto generate GUID in mvc5 that uses EF在使用 EF 的 mvc5 中自动生成 GUID
【发布时间】:2018-02-07 18:03:45
【问题描述】:

我有一个连接到 EF 数据库的 mvc5 应用程序。此数据库中的某些字段旨在按照 SQL 中的声明自动生成,但在 MVC 中使用和插入记录时,GUID 仅包含所有记录的值 0。我该如何解决这个问题?任何帮助将不胜感激。谢谢。

模型类:

 public partial class Store
    {
        public int StoreID { get; set; }
        public int CustomerID { get; set; }
        public string StoreName { get; set; }
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public System.Guid StoreUID { get; set; }
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int StoreNumber { get; set; }
        public string StoreLogo { get; set; }
        public string StoreLogoPath { get; set; }
        public string StoreAddress { get; set; }
        public string StoreCity { get; set; }
        public string StoreRegion { get; set; }
        public string StoreCountry { get; set; }

        public virtual Customer Customer { get; set; }
    }

StoreUID 和 StoreNumber 都应该是自动生成的字段。下面是插入新商店时的示例,但是目前,storeNumber 和 StoreUID 都只返回 0。

【问题讨论】:

    标签: sql asp.net-mvc entity-framework auto-generate


    【解决方案1】:

    这并不是真正的实体框架功能。 EF 需要了解这些列类型才能生成适当的 SQL。您需要的是从数据库中实际获得的东西。对于 Model First,我通过修改 EF 附带的 T4 模板来编写适当的 SQL 来获得自动生成的 int Id 功能,但它确实是数据库功能。 StoreNumber 是另一种情况,因为 SQL Server 只允许一个标识列。

    对于您的数据库,您的 StoreUID 列规范应该是:

    StoreUID uniqueidentifier not null DEFAULT newid()
    

    您没有指定是先处理模型还是先处理代码,还是要构建新的东西,因此您可能需要为此修改现有表。

    编辑

    如果您首先使用模型,请确保在您的模型中将 Store Generated Column 设置为 Identity,以便服务器生成 StoreUID 值。如果没有,并且您不担心谁/什么创建了 GUID,那么为Store 创建一个默认构造函数(如果您还没有的话)。然后在那里添加StoreUID = Guid.NewGuid();

    对于 StoreNumber,SQL Server 不支持具有自动递增整数的多个列。您需要研究多种插入策略。

    列出了一个号码herehere。本质上用Computed Columns将StoreNumber变成StoreID的函数,或者使用an independent Sequence

    ALTER TABLE Store DROP COLUMN StoreNumber;  
    GO  
    ALTER TABLE Store ADD StoreNumber AS StoreID + 550000; 
    

    【讨论】:

    • 谢谢。我的数据库中确实有默认值,所以我不确定还有什么问题。知道还有什么可能导致它无法自动生成吗?
    • 啊,在这种情况下,请确保在插入时没有从 EF 设置值。尝试从 SQL 手动插入以验证您的列是否具有正确的规范
    • 我已经从 SQL 手动插入,它运行良好。不知道为什么它从我的应用程序返回 0 :(。我将如何检查 EF 是否正在设置该值?因为它只是奇怪地将其初始化为全零
    • 这可能是因为初始化新的 Store 对象,是在插入之前设置默认值(带零)。请参阅模型优先方法的编辑
    • 这是什么意思?能给我举个例子吗
    【解决方案2】:

    您需要为数据库表添加默认值以生成字段。

    ALTER TABLE [dbo].[Store] ADD  DEFAULT (newid()) FOR [StoreUID]
    
    ALTER TABLE [dbo].[Store] ADD  DEFAULT (myfuncthatreturnsanint()) FOR [StoreNumber]
    

    【讨论】:

    • 我的数据库表中目前确实有这些默认值
    • 无法正确自动生成的任何其他可能原因
    猜你喜欢
    • 2016-01-15
    • 2012-06-25
    • 2011-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多