我在運行時創建了 2 種 poco 型別(使用反射)。這兩個應該互相參考。這些 pocos 的后續實體可以使用物體框架存盤在資料庫中。
目前我面臨兩個問題:
- 這是不可能的,或者至少我不知道我如何能夠對這種雙向參考進行編碼(因為在描述了 Poco 時,另一個 poco 的型別不存在)。
2.由于我沒有找到問題 1 的答案,我決定使用 object 作為參考的型別。所以模型現在包含以下行:
$ 公共物件 Poco1 {get; 設定;} 和:
public object Poco2 {get; set;}
物件的使用現在讓我面臨另一個問題。因為,在 OnModelCreating 期間拋出例外,該物件需要包含一個 id。
據我所知,這意味著 ef core 認為,“物件”將是模型的型別,應該被參考。
有沒有人知道我如何做我想做的事?
謝謝 :)
uj5u.com熱心網友回復:
每當我遇到涉及泛型和反射的問題時。我發現以通用方法解決問題的通用部分更容易;
public class Parent<TChild> where TChild : class
{
public ICollection<TChild> Children { get; set; }
}
public class Child<TParent> where TParent : class
{
public TParent Parent { get; set; }
}
public void DefineRelationship<TParent, TChild>(ModelBuilder modelBuilder)
where TChild : Child<TParent>
where TParent : Parent<TChild>
{
modelBuilder.Entity<TParent>()
.HasMany(p => p.Children)
.WithOne(c => c.Parent);
}
現在您需要使用反射來呼叫具有正確型別的方法。
uj5u.com熱心網友回復:
您的物體應如下所示:
public class Poco1
{
public int Id {get; private set;}
...
public Poco2 Poco2 {get; private set;}
public void SetPoco2(Poco2 poco2)
{
Poco2 = poco2;
}
}
public class Poco2
{
public int Id {get; private set;}
...
public int Poco1Id {get; private set;}
public Poco1 Poco1 {get; private set;}
}
然后設定它們:
async Task SomeMethod()
{
var poco1 = new Poco1();
var poco2 = new Poco2();
poco1.SetPoco2(poco2);
//at first only poco1 has reference to poco2
//and poco2 does not have reference to poco1 yet
Debug.Assert(poco1.Poco2 == poco2);
Debug.Assert(poco2.Poco1 != poco1);
await _someRepository.AddAsync(poco1);
await _someRepository.SaveChnagesAsync();
//After saving changes EF core manages the primary keys and references
Debug.Assert(poco1.Poco2 == poco2);
Debug.Assert(poco2.Poco1 == poco1);
}
和模型構建器:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
var poco1Builder = modelBuilder.Entity<Poco1>();
poco1Builder.HasKey(x => x.Id);
poco1Builder
.HasOne(x => x.Poco2)
.WithOne(x => x.Poco1)
//Poco2 will have Poco1Id in db that will be used for reference
//Also Poco1Id does not have to be set manually, EF core takes care of that
.HasForeignKey<Poco2>(x => x.Poco1Id);
;
var poco12Builder = modelBuilder.Entity<Poco2>();
}
此外,如果在保存到 db SetPoco2 之前需要參考,可以修改為:
public void SetPoco2(Poco2 poco2)
{
Poco2 = poco2;
poco2.SetPoco1(this);
}
并在 Poco2 中設定方法:
public void SetPoco1(Poco1 poco1)
{
Poco1 = poco1;
}
對于可維護性差的大型專案來說,參考方式太危險了
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/335917.html
上一篇:使用物體框架的一對一關系
