Entity Framework生成guid作为id并将其保存

问题描述 投票:0回答:1

我正在尝试将其保存到我的表中。用户说,字符串ID,字符串电子邮件和字符串密码。问题是ID必须是我必须创建并保存它的GUID,而不是SQL Server。有什么想法吗?我搜索了一下,但只找到了如何使sql server创建GUID。谢谢!

asp.net entity-framework api id
1个回答
0
投票

首先,告诉Entity Framework您将生成主键的值:使用DatabaseGenerated Attribute

public class School
{
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int Id { get; set; }
    public string Name {get; set;}
    ...
}

无选项可防止数据库在其他情况下会自动创建值。

此外,请考虑覆盖DbContext.SaveChanges()。在此过程中,向ChangeTracker询问添加的所有元素。为每个添加的元素生成一个ID。让其他人生成ID可能很危险,因为他们可能会添加一个恒定值或只是一个自动增量。

另一种可能性是在Add函数中生成它,但是如果您这样做,则用户可以更改您生成的ID。因此,正确的位置在SaveChanges中:

public override int SaveChanges()
{
    var addedElements = this.ChangeTracker.Entries
        .Where(entry => entry.State == EntityState.Added);

    foreach(var addedElement in addedElements)
    {
        // This will fail: the added element doesn't have a property Id:
        addedElement.Id = GenerateId();
    }
    return base.SaveChanges();
}

为此,您必须确保每个添加的元素都有一个属性ID。最简单的方法是创建一个接口,并让所有表实现此接口:

public interface IID
{
    string Id {get; set;}
}

public class School : IID {...}
public class Student : IID {...}
public class Teacher : IID {...}

public class DbContext
{
    public DbSet<School> Schools {get; set;}
    public DbSet<Student> Students{get; set;}
    public DbSet<Teacher> Teachers {get; set;}

    public override int SaveChanges()
    {
         var addedElements = this.ChangeTracker.Entries.Cast<IID>
        .Where(entry => entry.State == EntityState.Added);

        foreach(var addedElement in addedElements)
        {
            addedElement.Id = GenerateId(); // Every Added element implements IId
        }
        return base.SaveChanges();
    }

    private string GenerateId()
    {
         ... // TODO: return unique ID, for instance a GUID
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.