Entity Framework : 如何用相同的对象创建双重关系(1-1 和 many-1)
Entity Framework : how to create double relationship (1-1 and many-1) with same objects
我有两个 class :
class Sub
{
public Guid Id { get; set; }
public DateTime ValidDate { get; set; }
public Guid MasterId { get; set; }
public Master Master { get; set; }
}
和
class Master
{
public Guid Id { get; set; }
public int Data { get; set; }
public ICollection<Sub> Subs { get; set; }
public Sub MainSub { get; set; }
}
简单来说,一个master有一个main sub来定义它,可以有0个或多个"secondary" sub。
我试过用这种方式做映射
var mBuilder = modelBuilder.Entity<Master>();
mBuilder.HasMany(m => m.Subs).WithOne(m => m.Master).HasForeignKey(m => m.MasterId);
mBuilder.HasOne(m => m.MainSub).WithOne(m => m.Master);
但我有一个预期的例外 ("Master cannot participate in two relationships")。我不想更改我的模型,因为它适合我的需要,我该如何执行这样的映射才能做到这一点?
您无法映射此关系。每一种关系都有 2 个端点,您 class 中的一个复杂 属性 不能成为 2 个关系的端点。
我会在我的 Sub
[=43= 中创建一个 bool? IsMainSub
属性 ] 并在我的 [=11 中为 MasterId
和 IsMainSub
创建唯一键约束=]class。这将确保 Master
记录不能有 2 个主要 Sub
记录。
UPDATE - 我知道这看起来并不完美,IsMainSub
属性 只允许值 true
和 null
因为设置值 false
会触发唯一约束冲突。这是您可以添加到 属性 setter 的逻辑,以获取任何 false
值并将其转换为 null。
据我所知,您可以创建一个唯一键约束,允许某些列的 null
值而不违反约束。我会仔细检查一下。
我有两个 class :
class Sub
{
public Guid Id { get; set; }
public DateTime ValidDate { get; set; }
public Guid MasterId { get; set; }
public Master Master { get; set; }
}
和
class Master
{
public Guid Id { get; set; }
public int Data { get; set; }
public ICollection<Sub> Subs { get; set; }
public Sub MainSub { get; set; }
}
简单来说,一个master有一个main sub来定义它,可以有0个或多个"secondary" sub。 我试过用这种方式做映射
var mBuilder = modelBuilder.Entity<Master>();
mBuilder.HasMany(m => m.Subs).WithOne(m => m.Master).HasForeignKey(m => m.MasterId);
mBuilder.HasOne(m => m.MainSub).WithOne(m => m.Master);
但我有一个预期的例外 ("Master cannot participate in two relationships")。我不想更改我的模型,因为它适合我的需要,我该如何执行这样的映射才能做到这一点?
您无法映射此关系。每一种关系都有 2 个端点,您 class 中的一个复杂 属性 不能成为 2 个关系的端点。
我会在我的 Sub
[=43= 中创建一个 bool? IsMainSub
属性 ] 并在我的 [=11 中为 MasterId
和 IsMainSub
创建唯一键约束=]class。这将确保 Master
记录不能有 2 个主要 Sub
记录。
UPDATE - 我知道这看起来并不完美,IsMainSub
属性 只允许值 true
和 null
因为设置值 false
会触发唯一约束冲突。这是您可以添加到 属性 setter 的逻辑,以获取任何 false
值并将其转换为 null。
据我所知,您可以创建一个唯一键约束,允许某些列的 null
值而不违反约束。我会仔细检查一下。