11

我目前正在尝试使用实体框架4.1及其代码第一种方法的RC实现我的域对象的存储库。 现在我有一个域实体“远航”具有封装在类型的唯一标识符“VoyageNumber”EF4.1代码第一个复杂类型作为主键

public class VoyageNumber 
{ 
    private readonly string number; 

    public VoyageNumber(string number) 
    { 
     Validate.NotNull(number, "VoyageNumber is required"); 

     this.number = number; 
    } 

    public string Id 
    { 
     get { return number; } 
    } 

现在,我得到一个异常时,我这样做,我的DbContext的配置:

modelBuilder.Entity<Voyage>().HasKey<VoyageNumber>(k => k.VoyageNumber); 

属性“VoyageNumber”不能 用作密钥属性的实体 “Domain.Model.Voyages.Voyage”,因为 属性类型是不是一个有效关键 类型。仅支持标量类型,字符串和 byte []是支持的键类型。

并且当我尝试:

modelBuilder.Entity<Voyage>().HasKey<string>(k => k.VoyageNumber.Id); 

属性表达数k => k.VoyageNumber.Id'无效。该 表达式应该代表 属性:C#:“T => t.MyProperty”

我真的有垃圾我VoyageNumber并用原始类型更换呢?

+0

当使用此什么是异常消息:

protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity<TestPaperResult>() .Ignore(t => t.Id) .HasKey(t => new {t.TestPaperId, t.UserId}); } 
在存储库

modelBuilder.Entity ().HasKey (K = > k.VoyageNumber); – tpeczek 2011-04-02 11:05:34

+0

用异常消息更新了问题。 – hoetz 2011-04-02 11:16:37

+0

EF中仍然存在这样的情况6.1.3 – 2016-04-08 10:35:47

回答

14

这是限制。关键成员只能是实体中的标量属性。复杂类型表示为不受支持的复杂属性。

+0

真可惜,那么我想我会先放弃Code,因为我不愿意放弃主键的封装。 – hoetz 2011-04-02 11:54:51

+0

我不清楚。这是Entity框架的限制。不仅仅是代码的局限性。 – 2011-04-02 13:17:38

+5

这在EF6中仍然如此吗?我得到原始问题中记录的相同错误,所以我认为没有任何变化,但希望一些配置选项已添加,我错过了。 – sellmeadog 2015-01-22 22:10:09

0

对于一个孤立的类,您可以通过在您的DbContext中添加一个“get”方法来执行只读解决方法,该方法执行SqlQuery<>并将该表内部映射到该类(以旧式方式)。

我已经工作了一个最小的测试案例在这里:https://github.com/timabell/ef-complex-pk

例如

public class TestDbContext : DbContext 
{ 

    public IEnumerable<UberWidget> GetUberWidgets() 
    { 
     return Database.SqlQuery<WidgetSqlDto>("select WidgetId, Name from Widgets") 
      .Select(dto => new UberWidget 
      { 
       UberWidgetId = new IdWrap { IdWrapId = dto.WidgetId }, 
       Name = dto.Name 
      }); 
    } 
} 
0

我们可以用下面的方法解决它。希望它有帮助。

public class TestPaperResultId: ValueObject 
{ 
    public TestPaperResultId(string testPaperId, string userId) 
    { 
     TestPaperId = testPaperId; 
     UserId = userId; 
    } 

    protected TestPaperResultId() { } 

    public string TestPaperId { get; protected set; } 
    public string UserId { get; protected set; } 

    public override string ToString() 
    { 
     return $"{TestPaperId}_{UserId}"; 
    } 
} 

public class TestPaperResult : AggregateRoot 
{ 
    private TestPaperResultId _id; 

    public TestPaperResultId Id 
    { 
     get => _id ?? (_id = new TestPaperResultId(TestPaperId, UserId)); 
     protected set 
     { 
      TestPaperId = value.TestPaperId; 
      UserId = value.UserId; 
      _id = value; 
     } 
    } 

    public string TestPaperId { get; protected set; } 

    public string UserId { get; protected set; } 

    protected TestPaperResult() { } 

    public TestPaperResult(TestPaperResultId id, 
          decimal fullmarks) 
    { 
     Id = id; 
     Fullmarks = fullmarks; 
    } 
} 

在的DbContext:

public Task<TestPaperResult> FindTestPaperResultAsync(TestPaperResultId id) 
{ 
    return GetByKeyAsync<TestPaperResult>(id.TestPaperId, id.UserId); 
}