经过几个小时的反复试验,我到达了这个thread,它解释了如何建立一个一对多,使用相同的两种类型的多对多关系和一对一关系。实体框架5.0b2代码优先:一对多和一对一的同一个表,带级联删除
但是,我不能让这个与级联工作删除:
抛出该异常:“无法确定相关 操作的有效顺序依赖可能存在由于外键约束, 模型的要求,或商店生成的值“。 (System.Data.UpdateException)异常消息=“无法确定 依赖操作的有效排序。由于外键约束,模型要求或存储生成的 值的 可能存在相关性。”,Exception Type =“System .Data.UpdateException“
这只会发生,如果我没有取消设置1:1关系(见下面的代码),我认为是有道理的,因为它会创建一个无效的引用。我只是想知道是否有更好的方式来表达这一点。
示例代码:
class Program
{
static void Main(string[] args)
{
Database.SetInitializer(new DropCreateDatabaseAlways<Context>());
using (var ctx = new Context())
{
var user = new User();
ctx.Users.Add(user);
ctx.SaveChanges();
var source = new PaymentSource();
user.PaymentSources = new Collection<PaymentSource>();
user.PaymentSources.Add(source);
user.DefaultPaymentSource = source;
ctx.SaveChanges();
// if I don't do this, I get ordering exception
user.DefaultPaymentSource = null;
ctx.SaveChanges();
ctx.Users.Remove(user);
ctx.SaveChanges();
Assert.Equal(0, ctx.Users.Count());
Assert.Equal(0, ctx.PaymentSources.Count());
}
}
}
public class User
{
public int Id { get; set; }
public virtual ICollection<PaymentSource> PaymentSources { get; set; }
public virtual PaymentSource DefaultPaymentSource { get; set; }
public int? DefaultPaymentSourceId { get; set; }
}
public class PaymentSource
{
public int Id { get; set; }
public virtual User User { get; set; }
public int UserId { get; set; }
}
public class Context : DbContext
{
public DbSet<User> Users { get; set; }
public DbSet<PaymentSource> PaymentSources { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<User>()
.HasOptional(u => u.DefaultPaymentSource)
.WithMany()
.HasForeignKey(u => u.DefaultPaymentSourceId)
.WillCascadeOnDelete(false);
modelBuilder.Entity<PaymentSource>()
.HasRequired(p => p.User)
.WithMany(p => p.PaymentSources)
.HasForeignKey(p => p.UserId)
.WillCascadeOnDelete();
}
}
你能解释一下两个需要1-1和1- *关系的表吗?更具体一点:它是否假定给出树结构的抽象? –
我认为模型是不言自明的,但我想不是。那么,'User'有N个'PaymentSource's(1:N),并且还保留默认值(1:1,0:1是严格的)。 – georgiosd