[英]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的外键?
如果可以修改架构,建议将资产所有权设为资产本身的属性,而不是客户资产关系的属性。 从Asset
到Customer
拥有一个不可为空的FK字段(例如Owner_CustomerID
)会强制实施“仅一个所有者”约束,并且可以轻松地从CustomerAsset.Asset.Owner
(或您选择的命名对象)中加载所有者。 此架构更改将大大简化您的查询。
此外,这将允许您向Customer
添加引用所有拥有资产的导航属性; 例如, Customer.OwnedAssets
更新:
还通过复合FK ( AssetId, Owner_CustomerId )
和新的导航属性( AssetId, Owner_CustomerId )
使用新的Owner_CustomerID
字段将导航属性Asset.OwningCustomerAsset
(或从Asset
到Asset
到CustomerAsset
由于我沿着这条路的另一端需要导航属性(不再需要),因此我一直保持一对一的心态。 以下是我想要的东西:
HasRequired(e => e.OwningCustomerAsset).WithMany().HasForeignKey(e => new { e.OwningCustomerId, e.AssetId });
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.