我正在尝试在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无效。在依赖类型
上找不到导航属性“客户”
这里有什么问题?我正在按照教程写信。
答案 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;}
}
在应用程序上插入代码后添加迁移和更新数据库。