【发布时间】:2014-05-22 22:36:53
【问题描述】:
我是 EF 新手,在尝试使用 Fluent API 创建单向导航关联(0 到多)时遇到问题。以下是这些类的简化版本:
public partial class Company
{
public int Id { get; set; }
// "Company" is NOT REQUIRED to have any BillingInfo records/objects
public virtual IList<BillingInfo> BillingInfos { get; set; }
}
public partial class BillingInfo
{
public int Id { get; set; }
// A "BillingInfo" requires ONE "Company"
public int Company_Id { get; set; }
}
我使用 EF 6.1 Code First 并启用了迁移以及 SQL Server 2012。
在我为“Company”和“BillingInfo”派生的 EntityTypeConfiguration 类中,我尝试了所有我能想到的实现方式:
- 公司不需要任何 BillingInfo 记录,但可能有很多。
- BillingInfo 只需要一家公司。
- 在 Company 和 BillingInfo 之间保持单向导航。 (不想在 BillingInfo 上拥有公司导航属性)
- EF 迁移在数据库中创建 NON-NULLABLE Company_Id 字段,并带有定义的 ForeignKey 约束。
我尝试过的所有方法都只能让我部分实现。我最接近的是这个(但唯一缺少的是没有创建外键约束):
class CompanyConfig : EntityTypeConfiguration<Company>
{
public CompanyConfig()
{
this.HasOptional(company => company.BillingInfos)
.WithMany()
.Map(m => m.MapKey("Company_Id"));
}
}
有什么想法吗???
【问题讨论】:
-
我不确定 fluent api 但是对于模型你可以通过更改 public int Company_Id { get;放; } 上市公司公司 { 得到;放; }
-
谢谢 Anshul,但我想保持单向导航。
-
您不想要双向的任何特殊原因?如果是性能,那么您可以通过下面提到的链接,他们提供了一种解决方案msdn.microsoft.com/en-us/data/jj713564.aspx
-
出于性能和将对象序列化为 JSON 的复杂性增加的原因,我想避免它。使用双向导航,您将不得不在序列化期间处理循环引用。
-
EF 推荐的方式如果使用双向导航,我猜你不应该建立你的 EF 模型/设计记住序列化,有很多方法可以避免循环引用,如使用 ScriptIgnore 数据注释或db.Configuration.LazyLoadingEnabled = false; db.Configuration.ProxyCreationEnabled = false;
标签: entity-framework foreign-key-relationship entity-framework-migrations fluent navigation-properties