【问题标题】:Entity Framework 6.1 Unidirectional Navigation Property 0 to Many with Fluent API实体框架 6.1 单向导航属性 0 到多与 Fluent API
【发布时间】: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 类中,我尝试了所有我能想到的实现方式:

  1. 公司不需要任何 BillingInfo 记录,但可能有很多。
  2. BillingInfo 只需要一家公司。
  3. 在 Company 和 BillingInfo 之间保持单向导航。 (不想在 BillingInfo 上拥有公司导航属性)
  4. 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


【解决方案1】:

我认为你应该使用以下代码:

private class CompanyMapping : EntityTypeConfiguration<Company>
    {
        public CompanyMapping()
        {
            this.HasMany(o => o.BillingInfos).WithOptional().HasForeignKey(fk => fk.Company_Id);
        }
    }
    private class BillingInfoMapping : EntityTypeConfiguration<BillingInfo>
    {
        public BillingInfoMapping()
        {
            this.HasOptional(o => o.Company).WithMany(c=>c.BillingInfos).HasForeignKey(fk => fk.Company_Id);
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-05
    • 1970-01-01
    • 1970-01-01
    • 2014-08-04
    相关资源
    最近更新 更多