我有一个客户端/服务器应用程序,其中服务器使用实体框架作为 ORM。每个要发送到客户端的实体都由 DTO 类表示。
实体框架和 DTO 类之间的映射是使用 AutoMapper 处理的。
假设我们有以下表格:
Person (string Name, int CountryID) Country (int CountryID, int Population, string Name)
它们由以下 EF 类表示:
class Person
{
public string Name { get; set; }
public int CountryID { get; set; }
public Country Country { get; set;}
}
class Country
{
public int CountryID { get; set; }
public int Population { get; set; }
public string Name { get; set;}
}
依次由以下 DTO 表示:
class PersonDTO
{
public string Name { get; set; }
public CountryDTO Country { get; set;}
}
class CountryDTO
{
public int CountryID { get; set; }
public int Population { get; set; }
public string Name { get; set;}
}
数据库的初始状态表示一个空的 Person-Table 和一个 Country-table,它有一个条目:(1, 123, 'CountryXYZ')
客户的应用程序任务是创建一个新的人员实体并将其国家参考附加到可用的“国家XYZ”国家实体。
为此,客户端应用程序首先请求可用的 CountryDTO。然后它创建一个新的 PersonDTO 实例并将其 Country 属性设置为它从服务器接收到的唯一 CountryDTO。然后这个 PersonDTO 实例被发送回服务器。服务器依次将 PersonDTO-instance 映射回 Person-instance。
服务器的最后一步现在是将 Person-instance 存储在 ObjectContext 中并调用 ObjectContext.SaveChanges()。
这种方法的问题是,只要我调用 ObjectContext.SaveChanges(),就会在数据库中创建一个新的 Country-row,而不仅仅是使用可用的 Country-row。我在这里想念什么?
我是 EF 的新手,我认为这个用例很常见......所以我希望有一个简单的解决方法。
如果问题描述不够清楚,请告诉我。
谢谢!