我试图使用实体框架Nullable
Guid
但是当我试图提交我得到验证的消息,由于外键是空的变化,我有以下领域类,DomainType
类有孩子DomainCustomField
: -实体框架与可空指引?导致验证错误
public class DomainType
{
public Guid? Id
{
get;
set;
}
private IList<DomainCustomField> _domainCustomFields;
public string Name
{
get;
set;
}
public Guid? AccountId
{
get;
set;
}
public virtual IList<DomainCustomField> DomainCustomFields
{
get
{
return this._domainCustomFields;
}
set
{
this._domainCustomFields = value;
}
}
}
DomainCustomField.cs
public class DomainCustomField
{
public Guid? Id
{
get;
set;
}
public string Name
{
get;
set;
}
public Guid? DomainTypeId
{
get;
set;
}
}
下面
是映射: -
modelBuilder.Domain<DomainCustomField>().HasKey((DomainCustomField p) => new
{
p.Id,
p.DomainTypeId
});
modelBuilder.Domain<DomainCustomField>()
.Property(p => p.Id)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
modelBuilder.Domain<DomainType>()
.HasMany(p => p.DomainCustomFields)
.WithRequired()
.HasForeignKey<Guid?>(x => x.DomainTypeId);
下面是我尝试插入的示例代码。
DomainType domainType = new DomainType()
{
AccountId = customer.Id
};
domainType.DomainCustomFields.Add(new DomainCustomField()
{
Name = "Test"
});
Workspace.Add<DomainType>(domainType);
Workspace.CommitChanges();
错误: - 用于DomainTypeId验证错误需要
在相同的代码,如果我在ID变量正确地更改Guid?
到Guid
然后其工作。我不知道如何处理nullable
Guid
。我是否需要在子引用中手动设置父键?那么如何在Guid
的情况下正常工作?
注意: - 我使用的是Guid
,因为我使用分布式数据库,其中id可以从多个源系统生成。 我使用Guid?
,因为默认Guid
生成00000000-0000-0000-0000-000000000000
为空Guid
它可以增加数据库大小。
您试过了(在模型中添加导航属性'DomainType')'.HasOptional' - >'modelBuilder.Domain() .Property(p => p.Id) ..HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity).HasOptional(p => p.DomainType).. HasForeignKey(x => x.DomainTypeId)' –
Developer
是的,我试过HasOptional。它不是那个问题。即使它们被链接,它也不会在子变量中设置父ID。 –
这个错误对我来说很合理,可能在这里我完全错了。当你的主键是“空的”(不知道“可空”主键是如何工作的)时,EF可能没有为子集合设置正确的关系(因为父ID是空的)。 – Developer