我試圖使用實體框架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