Mat*_*ker 5 asp.net asp.net-mvc entity-framework ef-code-first
我正在使用以下类来实现一对多关系:
public class Supplier
{
public Supplier()
{
SupplierId = Guid.NewGuid();
}
public Guid SupplierId { get; set; }
[Required]
public string Name { get; set; }
[Required]
public virtual Address Address { get; set; }
public virtual ICollection<Contact> Contacts { get; set; }
}
public class Contact
{
public Contact()
{
ContactId = Guid.NewGuid();
}
public Guid ContactId { get; set; }
[Required]
public string FirstName { get; set; }
[Required]
public string LastName { get; set; }
[Required]
public Guid SupplierId { get; set; }
[ForeignKey("SupplierId")]
public virtual Supplier Supplier { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我正在使用ASP.NET MVC 4,在创建新的Contact时,SupplierId在查询字符串中传递并作为隐藏字段添加到Contact create表单:
@Html.HiddenFor(model => model.SupplierId)
Run Code Online (Sandbox Code Playgroud)
这将成功创建联系人,并使用查询字符串中的Guid填充Contact的SupplierId字段.但是,问题是Contacts表有另一个名为Supplier_SupplierId的虚拟供应商关系字段,该字段为NULL.我不确定我是否理解为什么甚至在Contacts表上创建Supplier_SupplierId,因为SupplierId应该被用作外键,这只是多余的.如果我尝试访问供应商的Contacts集合,我成功添加了Contact,则集合将返回空,因为Contact.Supplier_SupplierId为NULL.但是,如果我将SupplierId列中的值复制到Contact记录的Supplier_SupplierId列中,则Supplier.Contacts将返回Contact.
这是我的Contacts表最终看起来像:
CREATE TABLE [dbo].[Contacts] (
[ContactId] UNIQUEIDENTIFIER NOT NULL,
[FirstName] NVARCHAR (MAX) NOT NULL,
[LastName] NVARCHAR (MAX) NOT NULL,
[Supplier_SupplierId] UNIQUEIDENTIFIER NULL,
CONSTRAINT [PK_dbo.Contacts] PRIMARY KEY CLUSTERED ([ContactId] ASC),
CONSTRAINT [FK_dbo.Contacts_dbo.Suppliers_SupplierId] FOREIGN KEY ([SupplierId]) REFERENCES [dbo].[Suppliers] ([SupplierId]),
CONSTRAINT [FK_dbo.Contacts_dbo.Suppliers_Supplier_SupplierId] FOREIGN KEY ([Supplier_SupplierId]) REFERENCES [dbo].[Suppliers] ([SupplierId])
);
Run Code Online (Sandbox Code Playgroud)
有谁知道为什么在联系人中创建供应商的2个外键?如何更改它以便供应商的唯一外键是SupplierId?
这种映射是错误的(我在你的问题下面引用你的评论):
modelBuilder.Entity<Contact>()
.HasRequired(r => r.Supplier)
.WithMany()
.HasForeignKey(f => f.SupplierId)
.WillCascadeOnDelete(false);
Run Code Online (Sandbox Code Playgroud)
你需要:
modelBuilder.Entity<Contact>()
.HasRequired(r => r.Supplier)
.WithMany(s => s.Contacts)
.HasForeignKey(f => f.SupplierId)
.WillCascadeOnDelete(false);
Run Code Online (Sandbox Code Playgroud)
否则EF将被Supplier.Contacts视为属于另一个和第二个一对多关系的导航属性Supplier和Contact- 并且引入第二个外键.
| 归档时间: |
|
| 查看次数: |
3493 次 |
| 最近记录: |