14

我在实体框架中的映射有问题。

我有以下课程(简化):

public class Building
{

    public int ID { get; set; }     
    // *.. snip..* other properties
    public Location Location { get; private set; }
}

public class Location
{
    public string Street {get; set;}
    public Country country {get; set}
}
public class Country
{
    public int ID { get; set; } 
    public string Name { get; set; } 
}

Building 和 Country 是实体,它们保存在数据库中。Location 是一个值类型,应该映射到与 Building 相同的表。

但是,当我以这种方式映射它时,实体框架也希望将位置映射到一个表并且抱怨它没有键。我不想给它钥匙,因为它属于大楼,根本不应该是一个实体。

我见过一些变通方法,说你需要把 Country 放在 Building 类上,但这感觉不太好(而且在语义上完全是错误的)。

我正在使用实体框架 5

4

3 回答 3

1

Entity Framework Core 2发布以来,现在可以使用拥有的实体来实现这一点。

您的配置如下所示:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    // ...
    modelBuilder.Entity<Building>().OwnsOne(x => x.Location);
    modelBuilder.Entity<Location>().HasOne(x => x.Country);
    // ...
}

这样,类中的属性将被映射到Location表类的一部分。Building这意味着您将只有表BuildingCountry类,并且该Building表将具有该表的外键Country

我知道你发布这个问题已经很久了,但我认为这个答案可能对遇到这个问题的人有所帮助。

于 2018-09-18T14:44:32.660 回答
0

在我看来,实体框架不应该允许这种情况。

我知道您不将位置视为实体,但将实体引用添加到复杂类型似乎也不是一种可靠的方法。一座建筑与一个国家的关系非常直接。一座建筑属于一个国家。因此,建筑模型应包含国家/地区 ID。您希望映射什么?

如果您希望表 Building 只有三列ID, Street, CountryId并且您仍想保存 Location 模型,那么您应该使用以下复杂类型。

public class Location
{
    public string Street {get; set;}
    public int countryId {get; set}
}

但是,如果您希望 Building 表包含模型 Country 中的所有字段,那么这可能会导致一些棘手的情况,例如如果您想向 Country 模型添加新字段,或者如果您想添加其他复杂类型或根据新的业务案例将实体添加到您的国家/地区模型。

这些情况会与关系概念混淆,并且会在没有任何有意义的理由的情况下使您的结构过于复杂。(当然在我看来)

于 2018-04-24T13:24:13.653 回答
-3

您可以使用 [NotMapped] 属性在 Building 类中标记 Location 属性。

using System.ComponentModel.DataAnnotations.Schema;
public class Building
{
    [NotMapped]
    public Location Location { get; private set; }
}

希望能解决您的问题!

于 2013-06-24T12:36:57.030 回答