实体框架违反PRIMARY KEY约束6,模型一对多



我有两个模型一对多的关系,如果我在DbContext的不同实例中保存,这会抛出一个异常(违反主键)-如何避免它?

public class Customer
{
    public Guid Id { get; set; }
    public string Name { get; set; }
}
public class User
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public Customer Customer { get; set; }
}
public class DbContext : System.Data.Entity.DbContext
{
    public DbContext()
    : base(@"Data Source=(localdb)MSSQLLocalDB; AttachDBFilename='|DataDirectory|Sample.mdf'; Integrated Security=True")
    {
        Configuration.ProxyCreationEnabled = false;
        Configuration.AutoDetectChangesEnabled = true;
        Configuration.ValidateOnSaveEnabled = true;
        Configuration.LazyLoadingEnabled = true;
    }
    public IDbSet<Customer> Customers { get; set; }
    public IDbSet<User> Users { get; set; }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Properties<Guid>()
        .Where(p => p.Name == "Id")
        .Configure(p => { p.IsKey(); p.IsRequired(); });
    }
}
AppDomain.CurrentDomain.SetData(
    "DataDirectory",
    System.Environment.CurrentDirectory);
var customer = new Customer();
customer.Id = Guid.NewGuid();
customer.Name = "customername";
using (var db = new DbContext())
{
    db.Customers.Add(customer);
    db.SaveChanges();
}
var user = new User();
user.Id = Guid.NewGuid();
user.Name = "username";
user.Customer = customer;
using (var db = new DbContext())
{
    db.Users.Add(user);
    db.SaveChanges(); // <- Throw here
}

当然,这是一个简化的示例,在编写的示例中可能只使用一个DbContext实例,但实际上客户作为参数传递给方法

您是正确的-第二个实例不会知道您刚刚添加了客户。要么将它们包装在同一个using语句中,要么告诉第二个实例客户已经存在:

var user = new User();
user.Id = Guid.NewGuid();
user.Name = "username";
using (var db = new DbContext())
{   
    user.Customer = new Customer() { Id = customer.Id };  // only need the id
    db.Customers.Attach(user.Customer);
    db.Users.Add(user);
    db.SaveChanges();
}

实体框架:将现有子POCO添加到新的父POCO中,在DB

中创建新的子POCO

最新更新