use*_*862 5 .net c# entity-framework-core
我有一堂课
public class Document
{
public string TranId { get; set; }
public Record Record { get; set; }
public List<Error> Errors { get; set; }
}
public class Record
{
public string TranId { get; set; }
public List<DataResult> DataResults { get; set; }
}
public class DataResult
{
public string DataSourceName { get; set; }
public List<DataField> DataFields { get; set; }
public List<CustomField> CustomFields { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我想将 Record 和 DataResult 类映射为 Value 对象,所以我尝试映射为
public void Configure(EntityTypeBuilder<Document> builder)
{
builder.ToTable("Document");
builder.HasKey(x => x.TranId);
builder.OwnsOne(a => a.Record, a =>
{
a.ToTable("Doc_Record");
a.Property(p => p.TranId).HasMaxLength(100)
.HasColumnName("TranID")
.HasDefaultValue("");
a.OwnsMany(x => x.DataResults, x =>
{
x.ToTable("Doc_Rec_DataResults");
x.Property(p => p.DataSourceName).HasMaxLength(150)
.HasColumnName("DataSourceName")
.HasDefaultValue("");
});
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试添加此迁移时,它会出错并显示一条消息:
实体类型“DataResult”需要定义一个主键。
有人建议使用此链接,我尝试添加
a.OwnsMany(x => x.DataResults, x =>
{
x.WithOwner().HasForeignKey("RecordId");
x.ToTable("Doc_Rec_DataResults");
x.Property(p => p.DataSourceName).HasMaxLength(150)
.HasColumnName("DataSourceName")
.HasDefaultValue("");
});
Run Code Online (Sandbox Code Playgroud)
但是这种方法不起作用,因为WithOwner可以从.net core 3我使用的地方获得.net core 2(我是否真的需要将RecordId属性添加到Record类中(它是一个值对象)。
如果有人可以提供一个示例,说明如何使用OwnsManyin映射值对象的集合,那就太好了EF Core 2。
在这个 ef core 2.2示例中,我们有一个Company拥有 的集合Addresses,这是实现。请注意,我省略了一些有用的代码来坚持要点,请参阅完整的示例以获取进一步的解释。另请注意,此功能OwnsMany()在 ef core 2.2 之前版本中不可用
public class CompanyAddress
{
public string City { get; }
public string AddressLine1 { get; }
}
public class Company
{
private List<CompanyAddress> addresses = new List<CompanyAddress>();
public Guid Id { get; }
public string Name { get; }
public IEnumerable<CompanyAddress> Addresses { get => this.addresses; }
public void AssignAddress(CompanyAddress address)
{
var exists = this.addresses.Contains(address);
if (!exists)
{
this.addresses.Add(address);
}
}
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Company>().OwnsMany<CompanyAddress>("Addresses", a =>
{
a.HasForeignKey("CompanyId");
a.Property(ca => ca.City);
a.Property(ca => ca.AddressLine1);
a.HasKey("CompanyId", "City", "AddressLine1");
});
}
Run Code Online (Sandbox Code Playgroud)
这是文章所有者的完整解决方案的存储库
| 归档时间: |
|
| 查看次数: |
2487 次 |
| 最近记录: |