实体框架实体如何设置ID和外键约束?

时间:2019-04-03 18:02:27

标签: c# entity-framework

我有一些从数据库优先的数据库生成的Entity Framework 6实体。 它们看起来类似于下面的代码。

请注意,这里有一个CustomerID和一个Customer字段,其中Customer字段来自FK_Contact_Customer

在C#中处理此实体的实例时,应该设置CustomerID还是Customer?一旦设置了一个属性,如何使另一个保持一致?这是手动过程吗?是否有实体框架助手?

例如,如果我有一个Contact实体的实例和一个Customer实体的实例,将Contact.CustomerCustomer实例关联的正确方法是什么?我希望完成后,CustomerIDCustomer属性都将与关联保持一致。

注意:这可能是一个重复的问题,我确实进行了搜索,但找不到该(基本)问题的答案。

//------------------------------------------------------------------------------
// <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; }
    }
}

3 个答案:

答案 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记录并将其与联系。这不是我要采取的方法,可能需要进行配置。