在父表中插入数据,然后在子表中插入父主键

时间:2018-05-26 03:26:30

标签: c# asp.net-mvc entity-framework

我正在做我的最后一年项目,我们声称在设计和开发过程中遵循面向对象的方法。

我的问题是:我有一个父表User

public partial class User

此表有其属性。

然后我有一个子表Advertiser

public partial class Advertiser : User

我正在使用EF6。现在请告诉我如何将数据保存到User表中,然后获取UserID并将其粘贴到Advertiser表中。

问题

当我这样做时

Advertiser.AdvertiserID = User.UserID;

db.SaveChanges();

然后它说提供由于继承而产生的Advertiser类的所有值。

2 个答案:

答案 0 :(得分:1)

如果UserAdvertiser在数据库中存在关系,则Advertiser POCO中可能会User为一对一关系。

public partial class User
{
   public User() {..}    
   ...
   public virtual Advertiser Advertiser { get; set; }
}

如果是这样,您只需拨打SaveChanges一次即可。他们成为交易。

user.Advertiser = new Advertiser 
{
    // No need to assign value to AdvertiserID
    FirstName = "John",
    LastName = "Doe"
}; 
db.Users.Add(user);
db.SaveChanges();

否则,他们在数据库中没有关系。你将不得不一个接一个地保存。

db.Users.Add(user);
db.SaveChanges();

advertiser.AdvertiserID = user.UserID; // UserID is filled with newly created ID
db.Advertiser.Add(advertiser);
db.SaveChanges();

答案 1 :(得分:0)

在您的示例中,广告客户与用户之间的关系不是父子关系,而是继承关系。 EF支持三种继承模型:每种类型的表,每个层次结构的表和每个具体实例的表。为了更好地了解这些设置的方式以及它们的架构外观,您可以参考(https://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-1-table-per-hierarchy-tph),其中包含所有三个链接,或者Google EF和TPT / TPH / TPC的替代示例。 (DB-前)

在所有casses中,广告商的PK都是UserID。考虑到继承与构成,问题在于关系是否是一个"是一个"或者"有一个"。广告客户是用户,还是广告客户拥有用户?我猜想Is-A是一种准确的关系。

在Is-A关系中,"所有实体都是"用户将拥有" UserId"的PK。 (是否存在用户基表)在Has-A关系中,例如广告商具有地址,那么您会考虑多个到1或1对1之间的关系,其中广告商具有AddressID指向地址记录,或多对多有一个UserID和AddressID的连接表,将两者连接在一起。

只要保持这些关系一致,EF配置应该非常简单。