Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用复合键的一对一实体框架代码优先映射_C#_Entity Framework_Ef Code First - Fatal编程技术网

C# 使用复合键的一对一实体框架代码优先映射

C# 使用复合键的一对一实体框架代码优先映射,c#,entity-framework,ef-code-first,C#,Entity Framework,Ef Code First,是否可以在已定义的实体属性上创建一对一关系?我有以下实体: 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 {

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

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的实例只有一个。为了快速访问资产的当前所有者,我还在资产表中维护OwningCustomerId

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

HasRequired(e => e.OwningCustomerAsset).WithRequiredDependent().Map(m => m.MapKey("OwningCustomerId", "AssetId"));
当然,这会导致以下错误:“类型中的每个属性名称必须是唯一的。已定义属性名称‘OwningCustomerId’。”


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

如果您可以修改模式,我建议将资产所有权设置为资产本身的属性,而不是客户资产关系的属性。从
Asset
Customer
(例如
Owner\u CustomerID
)具有不可为空的FK字段将强制执行“仅一个所有者”约束,并且可以轻松地从
CustomerAsset.Asset.Owner
(或您选择的任何名称)加载所有者。此模式更改将大大简化查询

此外,这将允许您向
Customer
添加一个导航属性,该属性引用所有自有资产<例如,代码>客户所有资产

更新:


还可以使用新的
Owner\u CustomerID
字段,通过复合FK
(AssetId,Owner\u CustomerID)将导航属性
Asset.owningCustomerSet
(或任何您想要的)从
Asset
添加到
CustomerSet
以及由此产生的导航属性

因为我走这条路的另一端需要一个导航属性(我不再需要了),所以我一直坚持一对一的心态。以下是我想要的:

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

谢谢你的评论。实际上我已经考虑过了。它确实简化了我应用程序的某些部分。然而,我简化了我的帖子。我的视图返回的其他字段简化了其他内容。例如,当支持客户并按资产名称搜索时,父客户还希望当前所有者的资产名称与资产名称一起出现在其搜索结果中。拥有一对一的关系确实简化了这一点,因为我可以导航ca=>ca.OwnerCustomerAsset.Name。混合方法可能是最好的解决方案,然后-让资产中的所有者FK引用一个CustomerSet而不是CustomerSet实际上我的现有答案已经这样做了-FK将持有一个CustomerId,并且资产显然已经有了自己的ID,因此新的Owner_CustomerId字段可以用作FK to Customer以及复合FK to CustomerSet的一部分哦,是的,我懂了。我可以使用OwnerCustomerId和AssetId作为密钥在资产上配置OwnerCustomerAsset导航属性。然后在查询CustomerAsset…ca=>ca.asset.OwnerCustomerAsset.Name时,我将始终能够快速访问当前所有者的资产信息。不幸的是,在我想要的视图中还有其他“计算”字段。让我仔细考虑一下,看看这种方法是否能够真正满足我的需求,而不必使用混合方法。不幸的是,我在尝试创建这种复合密钥关系时仍然遇到同样的问题。我编辑了这篇文章来简化对这个问题的解释……其实和以前的问题是一样的。呃,我认为不可能做我想做的事。有一个循环引用。我想我可以在DB创建之后手动删除OwningCustomerId/AssetId的FK关系。但是,EF仍然足够聪明,可以在SubmitChanges()期间看到循环关系。