【问题标题】:Use UniqueIdentifier column type and [DatabaseGenerated(DatabaseGeneratedOption.Identity)] for model's key doesn't work in EF Code First使用 UniqueIdentifier 列类型和 [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 模型的键在 EF Code First 中不起作用
【发布时间】:2012-06-14 03:08:08
【问题描述】:

这是我的 MVC 模型:

public class Link
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid ID { get; set; }

    [DisplayName("Shorted URL")]
    public string SURL { get; set; }

    [DisplayName("General Link")]
    public string OriginalURL { get; set; }

    [DisplayName("Click Count")]
    public int ClickCount { get; set; }
}

这是LinkDBContext类:

public class LinkDBContext : DbContext
{
    public DbSet<Link> Links { get; set; }
}

当我想使用此代码向数据库添加一些数据时:

    private string GetNewID(string url, string id)
    {
        LinkDBContext Links = new LinkDBContext();
        //id = "http://" + id;
        List<Link> link = Links.Links.Where(a => (a.OriginalURL == id && a.SURL == id)).ToList();
        if (link.Count == 0)
        {
            List<Link> LLinks = Links.Links.ToList<Link>();
            Link li = new Link();
            //li.ID = new Guid();
            li.ClickCount = 0;
            li.SURL = id;
            li.OriginalURL = url;
            Links.Links.Add(li);
            Links.SaveChanges();
            Links.Dispose();
            return id.ToString();
        }

        return GetNewID(url);
    }

我只是得到一个例外:Cannot insert the value NULL into column 'ID', table 'GhiasiDB.dbo.Links'; column does not allow nulls. INSERT fails.The statement has been terminated.

问题是什么,我该如何解决?


更新

我将ID 的类型从Guid 更改为int,当我再次尝试时,我从List&lt;Link&gt; LLinks = Links.Links.ToList&lt;Link&gt;();GetNewID 方法中得到了这个异常:The 'ID' property on 'Link' could not be set to a 'Guid' value. You must set this property to a non-null value of type 'Int32'. 我不知道它是从哪里来的。我把所有Guides 都改成了int

【问题讨论】:

    标签: c# sql database asp.net-mvc-3 ef-code-first


    【解决方案1】:

    如果您允许 EF 生成表,它将创建默认值设置为 (newid()) 的 PK。如果您先设计了数据库,则可以手动设置。

    【讨论】:

    • ID 列是 uniqeidentifire 并且是 PK 但我仍然得到异常!
    • @ahmadalishafiee 您是否将表中ID 列的Default Value or Binding 属性设置为(newid())
    【解决方案2】:

    如果表在添加[DatabaseGenerated(DatabaseGeneratedOption.Identity)]之前已经存在,则删除DbSet,运行Update-Database,再次添加DbSet,最后运行另一个Update-Database

    至少这对我来说是固定的。

    【讨论】:

    • 这正是问题所在!谢谢!
    【解决方案3】:

    我认为这是因为 GuidIdentity 不兼容。您如何看待自动递增 Guid?

    也许将 Id 更改为 int 可以帮助您

    【讨论】:

      【解决方案4】:

      Guid 是结构类型,即值类型。您不能将 null 分配给值类型。如果你想要这个而不是那种情况,你可以在输入声明后使用“?”。

        public Guid? ID { get; set; }
      

      如果这仍然没有帮助,请尝试 int

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-09
        • 2020-06-25
        相关资源
        最近更新 更多