CTP5 Code-First - 设置外键列的名称 [英] CTP5 Code-First - Setting name of foreign key column
问题描述
当我尝试使用非标准列名映射外键时,我遇到了一个奇怪的异常。外键只应在新闻方面的域模型中可见,因为我不需要在
用户模型中引用用户的所有内容的集合。
I'm getting a strange exception when I try to map a foreign key with a non standard column name. The foreign key should only be visible in the domain model from the News side because I don't need a collection for everything that refers to a user inside the User model.
使用以下代码,我总是得到这个例外:
With the following code I always get this exception:
System.InvalidOperationException - Sequence包含多个匹配元素
System.InvalidOperationException - Sequence contains more than one matching element
StackTrace:
在System.Linq.Enumerable.SingleOrDefault [TSource](IEnumerable`1 source,Func`2谓词)
at System.Data.Entity.ModelConfiguration.Configuration.Properties.Navigation.IndependentAssociationMappingConfiguration`1.Configure(DbAssociationSetMapping associationSetMapping)
在System.Data.Entity.ModelConfiguration.Configuration.Properties.Navigation.NavigationPropertyConfiguration.Configure(DbDatabaseMapping databaseMapping)
在System.Data.Entity.ModelConfiguration.Configuration.Types.EntityTypeConfiguration。<> c__DisplayClass24。< ConfigureAssociationMappings> b__23(NavigationPropertyConfiguration c)
在System.Data.Entity.ModelConfiguration.Utilities.IEnumerableExtensions.Each [T](IEnumerable`1 ts,Action`1 action)
在System.Data.Entity.ModelConfiguration.Configuration.Types.EntityTypeConfiguration.ConfigureAssociationMappings(DbDatabaseMapping databaseMapping)
......
StackTrace:
at System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable`1 source, Func`2 predicate)
at System.Data.Entity.ModelConfiguration.Configuration.Properties.Navigation.IndependentAssociationMappingConfiguration`1.Configure(DbAssociationSetMapping associationSetMapping)
at System.Data.Entity.ModelConfiguration.Configuration.Properties.Navigation.NavigationPropertyConfiguration.Configure(DbDatabaseMapping databaseMapping)
at System.Data.Entity.ModelConfiguration.Configuration.Types.EntityTypeConfiguration.<>c__DisplayClass24.<ConfigureAssociationMappings>b__23(NavigationPropertyConfiguration c)
at System.Data.Entity.ModelConfiguration.Utilities.IEnumerableExtensions.Each[T](IEnumerable`1 ts, Action`1 action)
at System.Data.Entity.ModelConfiguration.Configuration.Types.EntityTypeConfiguration.ConfigureAssociationMappings(DbDatabaseMapping databaseMapping)
......
代码:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity< User>()。Property(x => x.Id).HasColumnName(" id");
modelBuilder.Entity< User>()。Property(x => x.Email).HasColumnName(" email");
modelBuilder.Entity< News>()。Property(x => x.Id).HasColumnName(" id");
modelBuilder.Entity< News>()
.HasRequired(x => x.Author)
.WithMany()
.IsIndependent()
.Map(m => m.MapKey(x => x.Id," user_id"));
$
}
公共类新闻:实体
{
新闻(){} // EF必须支付b
$
// FIXME:可以直接使用IUser吗?或者是否需要存储库?
公共新闻(用户作者)
:base(true)
{
作者=作者;
}
公共虚拟用户作者{get;组; }
}
公共类用户:实体
{
用户(){} // EF需要
public User(string email)
:base(true)
{
电子邮件=电子邮件;
}
public string Email {get;组; }
}
公共抽象类实体
{
;&NBSP;受保护的实体(bool generate = false)
{
if(generate)
{
Id = Guid.NewGuid();
}
}
public virtual Guid Id {get;组; } b $ b}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<User>().Property(x => x.Id).HasColumnName("id");
modelBuilder.Entity<User>().Property(x => x.Email).HasColumnName("email");
modelBuilder.Entity<News>().Property(x => x.Id).HasColumnName("id");
modelBuilder.Entity<News>()
.HasRequired(x => x.Author)
.WithMany()
.IsIndependent()
.Map(m => m.MapKey(x => x.Id, "user_id"));
}
public class News : Entity
{
News() { } //Required for EF
//FIXME: possible to use IUser directly? or is repository needed?
public News(User author)
: base(true)
{
Author = author;
}
public virtual User Author { get; set; }
}
public class User : Entity
{
User() { } //Required for EF
public User(string email)
: base(true)
{
Email = email;
}
public string Email { get; set; }
}
public abstract class Entity
{
protected Entity(bool generate = false)
{
if (generate)
{
Id = Guid.NewGuid();
}
}
public virtual Guid Id { get; set; }
}
推荐答案
查看此主题:
干杯,
Andrew。
这篇关于CTP5 Code-First - 设置外键列的名称的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!