我有一些从数据库优先的数据库生成的Entity Framework 6实体。 它们看起来类似于下面的代码。
请注意,这里有一个CustomerID
和一个Customer
字段,其中Customer
字段来自FK_Contact_Customer
。
在C#中处理此实体的实例时,应该设置CustomerID
还是Customer
?一旦设置了一个属性,如何使另一个保持一致?这是手动过程吗?是否有实体框架助手?
例如,如果我有一个Contact实体的实例和一个Customer
实体的实例,将Contact.Customer
与Customer
实例关联的正确方法是什么?我希望完成后,CustomerID
和Customer
属性都将与关联保持一致。
注意:这可能是一个重复的问题,我确实进行了搜索,但找不到该(基本)问题的答案。
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated from a template.
//
// Manual changes to this file may cause unexpected behavior in your application.
// Manual changes to this file will be overwritten if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace MyProject.DAL.Context
{
using System;
using System.Collections.Generic;
public partial class Contact
{
public int ID { get; set; }
public int CustomerID { get; set; }
public string Contact1 { get; set; }
public string Email { get; set; }
public string ContactTitle { get; set; }
/// <summary>
/// FK_Contact_Customer
/// </summary>
public virtual Customer Customer { get; set; }
}
}
答案 0 :(得分:1)
您应该注释客户属性,使其看起来像这样。
[ForeignKey("CustomerID")]
public virtual Customer Customer { get; set; }
如果您使用外键属性,则不必手动设置CustomerID属性。
答案 1 :(得分:0)
或者您可以在迁移过程中使用FluetAPI将实体映射到数据库
最好不要创建一个名为ContactConfig的类,该类将创建该实体的所有关系。
public class ContactConfig: EntityTypeConfiguration<Contact>
{
public ContactConfig()
{
HasKey(c => c.ID);
Property(c => c.Contact1 )
.IsRequired();
Property(c => c.Email )
.IsRequired();
Property(c => c.ContactTitle )
.IsRequired();
//Here is the secret
HasRequired(c => c.Costumer)
.WithMany(c => c.Contact)
.HasForeignKey(c => c.CustomerID);
}
}
CostumerID只是一个导航属性,将成为Costumer类的外键。您必须将Costumer类的ID与Contact类中的CostumerID属性相关联。
使用此设置,当您需要将客户与联系人相关联时,只需调用CostumerID属性
此后,只需在软件包Manager控制台中键入Update-Database。
答案 2 :(得分:-1)
我假设您正在尝试创建一个与现有客户相关的新联系人,在这种情况下,您将填充Contact.CustomerID并将Contact.Customer保留为空。 Contact.CustomerID是客户实体的外键。 Contact.Customer是从Contact到Customer的导航属性,在读取数据时将使用该属性,因此访问Contact.Customer会为您提供相关的Customer实体。
我不确定创建填充了客户的联系人的含义,这可能会导致Customer实体被更新,或者如果未填充Customer ID,则可能会创建新的Customer记录并将其与联系。这不是我要采取的方法,可能需要进行配置。