繁体   English   中英

带有组合键的一对一实体框架代码优先映射

[英]One-To-One Entity Framework Code-First Mapping With Composite Keys

是否可以在已定义的实体属性上创建一对一关系? 我有以下实体:

public class Asset
{
    public int AssetId { get; set; }
    public int OwningCustomerId { get; set; }
    public virtual Customer OwningCustomer { get; set; }
}

public class CustomerAsset
{
    public int CustomerId { get; set; } // Primary key 0
    public int AssetId { get; set; }    // Primary key 1
    public int CustomerAssetStatusId { get; set; }
    public string Name { get; set; }

    public virtual Customer Customer { get; set; }
    public virtual Asset Asset { get; set; }
}

CustomerAsset代表资产的各种所有权状态。 尽管同一个AssetId可以在该表中多次存在,但是只有一个实例,其中CustomerAssetStatusId =1。为了快速访问资产的当前所有者,我还在Asset表中维护OwningCustomerId。

我想要一个从资产到CustomerAsset的导航属性,称为OwningCustomerAsset。 这是一对一的关系。 不幸的是,我不知道如何定义它,因为外键字段已经在Asset中定义了。 通常,我会在Asset上创建这样的关系:

HasRequired(e => e.OwningCustomerAsset).WithRequiredDependent().Map(m => m.MapKey("OwningCustomerId", "AssetId"));

当然,这将导致以下错误:“类型中的每个属性名称都必须是唯一的。属性名称'OwningCustomerId'已经定义。”

如何告诉EF OwningCustomerId / AssetId是CustomerAsset的外键?

如果可以修改架构,建议将资产所有权设为资产本身的属性,而不是客户资产关系的属性。 AssetCustomer拥有一个不可为空的FK字段(例如Owner_CustomerID )会强制实施“仅一个所有者”约束,并且可以轻松地从CustomerAsset.Asset.Owner (或您选择的命名对象)中加载所有者。 此架构更改将大大简化您的查询。

此外,这将允许您向Customer添加引用所有拥有资产的导航属性; 例如, Customer.OwnedAssets

更新:

还通过复合FK ( AssetId, Owner_CustomerId )和新的导航属性( AssetId, Owner_CustomerId )使用新的Owner_CustomerID字段将导航属性Asset.OwningCustomerAsset (或从AssetAssetCustomerAsset

由于我沿着这条路的另一端需要导航属性(不再需要),因此我一直保持一对一的心态。 以下是我想要的东西:

HasRequired(e => e.OwningCustomerAsset).WithMany().HasForeignKey(e =>  new { e.OwningCustomerId, e.AssetId });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM