Use UniqueIdentifier column type and [DatabaseGenerated(DatabaseGeneratedOption.Identity)] for model's key doesn't work in EF Code First

This is my MVC model:

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; }
}

and this is LinkDBContext class:

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

when I want to add some data to database using this code:

    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);
    }

I just get an exception that is: Cannot insert the value NULL into column 'ID', table 'GhiasiDB.dbo.Links'; column does not allow nulls. INSERT fails.The statement has been terminated.

what is the problem and how can I resolve it?


update

I changed the type of ID from Guid to int and when I tried again I got this exception from List<Link> LLinks = Links.Links.ToList<Link>(); of GetNewID method: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'. and I don't know where did it come from. I changed all Guides to int!

Answers


If you allowed EF to generate the tables it would create the PK with a default value set to (newid()). You can set it manually if you designed the database first.


If the table already existed before adding [DatabaseGenerated(DatabaseGeneratedOption.Identity)], then remove the DbSet, run Update-Database, add the DbSet again, finally run another Update-Database.

At least that's what fixed it for me.


I think that's because Guid and Identity are not compatible. How do you think to auto-increment Guid?

Maybe changing Id to int could help you


Guid is structure type i.e value type. You can not assign null to value type. If you want this than in that case you can use "?" after type in declaration.

  public Guid? ID { get; set; }

if this still does not help, try an int


Need Your Help

Excel VBA: search a string to find the first non-text character

regex excel excel-vba vba

Cells contain a mixture of characters within a string, such as:

C#.Net Fails to read some EXIF data from JPG Image

c# android .net vb.net c#-4.0

I have written simple module in C#.Net which reads image property (i.e EXIF Data) and to do the same i have used below code: