实体框架1-1关系:“在依赖类型”

时间:2017-07-25 15:35:58

标签: c# entity-framework

我正在尝试在Entity Framework 6中定义1:1关系,代码优先。我已经按照本教程:http://www.entityframeworktutorial.net/code-first/configure-one-to-one-relationship-in-code-first.aspx

在我的示例中,一个客户可以拥有一个特定地址。 关于1:1关系,我已经阅读了很多,我不知道正确的方式是什么来定义这种关系。所以,这是我的课程:

public class Customer
{
    public int CustomerId { get; set; }
    public string CustomerName { get; set; }
    public Address Address { get; set; }
}

public class Address
{
    [ForeignKey("Customer")]
    public int AddressId { get; set; }
    public string AddressName { get; set; }
}

这是我的初始化:

List<Address> addresses = new List<Address>
{
    new Address { AddressName = "12 Main St., Houston TX 77001" },
    new Address { AddressName = "1007 Mountain Dr., Gotham NY 10286" }
};

List<Customer> customers = new List<Customer>
{
    new Customer { CustomerName = "John Doe", Address = addresses.ElementAt(0) },
    new Customer { CustomerName = "Bruce Wayne", Address = addresses.ElementAt(1) }
};
customers.ForEach(c => context.Customer.Add(c));
context.SaveChanges();

正如您所看到的,我不是直接插入地址,而是通过客户对象插入地址。这是实现1:1关系的正确方法吗?

无论如何,当我部署我的应用程序时,我收到此错误:

  

EntityFramework.dll中出现'System.InvalidOperationException'类型的异常,但未在用户代码中处理

     

附加信息:类型为“aspdotnetmvc.Models.Address”的属性“AddressId”上的ForeignKeyAttribute无效。在依赖类型

上找不到导航属性“客户”

这里有什么问题?我正在按照教程写信。

1 个答案:

答案 0 :(得分:0)

要在数据库模型关系中指定从属原则,您可以使用FluntAPI方法进行地图关系,例如:

从Context Class:

覆盖此方法
  protected override void OnModelCreating(DbModelBuilder modelBuilder)
  {
      base.OnModelCreating(modelBuilder);
      modelBuilder.Entity<Customer>()
          .HasOptional(x => x.Address)
          .WithRequired(c => x.Customer)
          .WillCascadeOnDelete(true);
  }

您的地址模型 Address.cs

public class Address
{
  public int AddressId { get; set; }
  public string AddressName { get; set; }
  public Customer Cutomer {get;set;}
}

在应用程序上插入代码后添加迁移和更新数据库。