0

我有一个试图通过 Entity Framework 4.3 访问的现有数据库。大多数表格和关系都不是问题,但是这组表格给我带来了一些我似乎无法找到答案的问题。

以下是(浓缩的)实体:

顾客

public class Customer
{
    public int CustomerID { get; set; }
    public string Name { get; set; }

    private int addressSourceTypeID = 2;
    [NotMapped]
    public int AddressSourceTypeID { 
        get { return addressSourceTypeID; } 
        set { addressSourceTypeID = value; } }

    public virtual ICollection<User> Users { get; set; }
    public virtual ICollection<Contract> Contracts { get; set; }
    public virtual ICollection<Address> Addresses { get; set; }
}

合同

public class Contract
{
    public int ContractID { get; set; }
    public string Name { get; set; }

    private int addressSourceTypeID = 4;
    [NotMapped]
    public int AddressSourceTypeID { 
        get { return addressSourceTypeID; } 
        set { addressSourceTypeID = value; } }

    public virtual int CustomerID { get; set; }
    public virtual Customer Customer { get; set; }

    //public virtual ICollection<Address> Addresses { get; set; }
}

地址

public class Address
{
    [Key]
    public int AddressID { get; set; }
    public int AddressSourceTypeID { get; set; }

    [ForeignKey("Customer")]
    public int SourceKey { get; set; }

    public virtual Customer Customer { get; set; }
    //public virtual Contract Contract { get; set; }
    public virtual ICollection<Contact> Contacts { get; set; }
}

我上面有两个实体CustomerContract它们都可以有Address子实体。当前,Address实体设置为Customer实体的子实体,并且由于没有指向Contractfrom的链接,因此可以正常工作Address

正如您从注释掉的代码段中看到的那样,我已经尝试像对实体所做的那样添加Contract到实体中。不幸的是,这不起作用,但由于在ForeignKey 注释中的引用,我并不感到惊讶。我什至尝试创建实体的特定版本(即),但是当多个实体尝试绑定到同一个表时出现错误。AddressCustomerCustomerAddressAddressCustomerAddress

我也尝试ModelBuilder在 EF中使用,DBContext但是我在这里的知识非常有限,我不知道在这种情况下该怎么做。

总的来说,我需要的是以下内容:

  • 拥有一组子地址的客户实体。
  • 合同实体拥有一组子地址。

这些“父”表与地址表之间的链接使用以下内容:

  • 客户:CustomerID => 地址:SourceKey 和客户:AddressSourceTypeID(始终为 2)=> 地址:AddressSourceTypeID。
  • 合同:ContractID => 地址:SourceKey 和合同:AddressSourceTypeID(始终为 4)=> 地址:AddressSourceTypeID。

如果有人可以帮助我或为我指出正确的方向,那就太好了。

非常感谢。

4

1 回答 1

2

您可以让 EFSourceKey使用 Table per Hierarchy Inheritance 强制执行您的属性 - 然后您的映射将中断,或者您可以SourceKey在您的业务逻辑中强制执行并且只让 EF 管理主Address类。

如果您必须维护当前的数据库模式,我认为让您的业务逻辑强制您SourceKey作为鉴别器是您唯一的选择:

public class Address
{
    public int AddressID { get; set; }
    public int AddressSourceTypeID { get; set; }
    public int SourceKey { get; set; }
    public virtual Contract Contract { get; set; }
    public virtual Customer Customer { get; set; }
}
public class Contract
{
    public Contract()
    {
        this.Addresses = new List<Address>();
    }

    public int ContractID { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Address> Addresses { get; set; }
}
public class Customer
{
    public Customer()
    {
        this.Addresses = new List<Address>();
    }

    public int CustomerID { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Address> Addresses { get; set; }
}

这在您的流利映射中:

        modelBuilder.Entity<Address>().HasOptional(t => t.Contract)
            .WithMany(t => t.Addresses)
            .HasForeignKey(d => d.SourceKey);
        modelBuilder.Entity<Address>().HasOptional(t => t.Customer)
            .WithMany(t => t.Addresses)
            .HasForeignKey(d => d.SourceKey);

或者 - 如果你创建了一个CustomerAddressand ContractAddress,你可以使用 TPH 继承来强制SourceKey- 但目前没有办法映射 Nav 属性:

public abstract class Address
{
    [Key]
    public int AddressID { get; set; }
    public int AddressSourceTypeID { get; set; }

    public int SourceKey { get; set; }
}

public class CustomerAddress : Address
{
    public virtual Customer Customer { get; set; }
}

public class ContractAddress : Address
{
    public virtual Contract Contract { get; set; }
}

这作为您的映射:

        modelBuilder.Entity<Address>()
            .Map<ContractAddress>(m => m.Requires("AddressSourceTypeID").HasValue(2))
            .Map<CustomerAddress>(m => m.Requires("AddressSourceTypeID").HasValue(4));

这将AddressSourceTypeID作为您的鉴别器强制执行 - 不幸的是,这里的细分是将您的导航属性映射回 ContractAddress 和客户地址。请参阅具有相同基本问题的相关帖子。也许这至少会让你朝着正确的方向前进。

于 2012-09-21T15:32:24.320 回答